晚上好!我现在的目标只是做一些小的东西来读出任何类型的文件中的字符(并将它们放入字符串中以供稍后在程序中使用(,但我目前一直遇到一个问题,当我运行代码时,它在"input[n] = (char(c;"行处分段错误,我尝试通过打印字符和 n 的值进行故障排除, 每次(尽管我将 malloc 更改为不同的大小(printf 语句都会在数字"134510"中途打印,或者在下面一行出错之前在偏移134509处打印字符。我想知道我的问题是什么以及如何解决它,因为该程序只能通过大约 10% 的文件对我来说很奇怪。
谢谢!!
int c = 0; //Counting the current character being read
int n = 0; //Counting the current character being written
char *input; //A string of all characters in the file
FILE *inputFile; //File to read
if(!(inputFile = fopen(argv[1],"r"))){ // Open in read mode
printf("Could not open file"); // Print and exit if file open error
return 1;
}
input = (char *)malloc(sizeof(inputFile) * sizeof(char));
while (1){ //Put all of the characters from the file into the string
c = fgetc(inputFile);
if(feof(inputFile)){ //If it reaches the end of the file, break the loop
break;
}
printf("%c ", c); //Troubleshooting
input[n] = (char)c;
n++;
}
问题是sizeof(inputFile)
不返回文件的大小。它返回FILE*
指针的大小(以字节为单位(;该指针的大小与基础文件的大小完全无关。
您正在寻找的内容在如何确定 C 语言中文件的大小?
你之所以出现段错误,是因为这一行:
input = (char *)malloc(sizeof(inputFile) * sizeof(char));
错误地标记文件的大小可能看起来是正确的;但是,您获得的是inputFile指针的大小。这与常规文件完全不同,因为指针在大多数计算机上只有 4 个字节!
这意味着您只分配 4 个字节的数据。
你如何避免这种情况?
由于您只是尝试读取字符,因此您可以简单地:
while ((int)(result = getline(&line, &capacity, inputs)) != -1)
这将读取整行,您可以将该行放入另一个字符 *。
您不必事先知道文件大小。
您可以使用下面描述的方法:
- 打开文件
- 分配结果缓冲区
- 读取字符
- 如果 EOF 则关闭文件,附加零字节并返回缓冲区。
- 将字符追加到缓冲区
- 如果缓冲区重新分配结束时具有双倍缓冲区大小。
- 从 3 继续