我正在尝试打印一个包含大约 4000 个字符的文件的内容。 该程序不知何故只记录了前 220 个字符并终止。
int main(void)
{
char ch = ' ', file_name[25], payload[3904];
FILE *fp;
printf("Enter the name of file you wish to see\n");
gets(file_name);
fp = fopen(file_name, "r"); // read mode
if (fp == NULL)
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
printf("The contents of %s file are :\n", file_name);
int gin = 0;
while ((ch = fgetc(fp)!=EOF))
{
printf("%d) %x \n",gin, ch);
payload[gin++] = ch;
}
printf("Also, value of gin is %d --->", gin);
getchar();
//...rest of the code
}
此处gin
的值为220。
为了检查,我修改了 while()
条件以针对文件中的确切字符数运行:
{
//...
while (gin<3904)
{
if ((ch = fgetc(fp)) == EOF) res++;//ADDED THIS TO COUNT NUMBER OF EOF's
printf("%d) %x \n",gin, ch);
payload[gin++] = ch;
//printf(" %x \n", payload[(gin - 1)]);
if (gin % 100 == 0)
{
printf("Also, value of res is %d --->", res); getchar();
getchar();
}
}
//...rest of the code
}
gin的值达到了3904,res(no. of EOF's)的值是3684,也就是说前220之后的每个字符都被当作EOF读取。程序在第一个 220 个字符后开始读取 FF
,即使它已被填充。
最佳答案
除了您应该将 ch
更改为 int
之外,我认为代码很好。
fgetc()
返回
- 如果成功,“将字符读取为转换为
int
的无符号字符” - 失败时,“
EOF
在文件末尾或错误”
因此,首先,您必须将 ch
更改为 int
,因为 fgetc()
的一些返回值可能不是 适合 char
。
现在,在第二种情况下,您没有根据 EOF
检查 fgetc()
的返回值来检测任何错误。您只是获取返回值并尝试将这些值存储到数组中。实际上,当到达文件末尾时,没有更多内容可读取,所有对同一文件指针的进一步读取将返回错误。
很可能是那些值。 220
在你的情况下是 valid ,在所有。
因此,对于您问题中的陈述,
(EOF occurs unexpectedly)
错了。它发生得很好,你忽略了它并遇到了,好吧,麻烦。
注意:
- 在您的第一个代码段中,您进行了两次连续的
fgetc()
调用,基本上丢弃了第一个的结果,并在没有任何检查的情况下使用了第二个。 - 永远不要使用
gets()
。它存在缓冲区溢出问题。始终使用fgets()
相反。
关于c - C 中未读取整个文件(意外出现 EOF),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31309897/