如何在 C 中使用 fscanf() 区分文件末尾和错误?

  • 本文关键字:文件 错误 fscanf c scanf eof feof
  • 更新时间 :
  • 英文 :


根据手册,int fscanf(FILE *stream, const char *format, ...)返回成功匹配和分配的输入项数,该数可以少于规定的值,在早期匹配失败的情况下甚至为零。我该如何区分:

  • 零匹配和分配的项目
  • 文件结尾
  • 空文件?

例如,请参阅 POSIX 规范的"返回值"部分以了解fscanf()

  • 零匹配和分配的项目由返回 0 的fscanf()报告。

  • 返回 EOF 的fscanf()报告文件结束。

  • 第一次调用返回的 EOFfscanf()报告空文件。

请注意,该处方使得很难发现空文件(无字节(和没有有用数据的文件之间的区别。 考虑这个测试程序(我称之为eof59.c,编译创建eof59(:

#include <stdio.h>
int main(void)
{
char buffer[256];
int rc;
while ((rc = scanf("%255s", buffer)) != EOF)
printf("%d: %sn", rc, buffer);
}

如果你用/dev/null作为输入(最终的空文件(运行它,它什么也没说。 但是,如果您向它提供带有单个空白(并且没有换行符(的文件,或者只是一个换行符,或者实际上任何空格序列,它也没有任何意义。 您还可以尝试将格式字符串替换为" x %255s"。 给它一个只有一个x的文件(周围可能有空格(不会产生任何输出。 给它一个以y作为第一个字符(空格除外(的文件,程序会运行很长时间,报告每行输出0:

请注意,while (!feof(file))总是错误的,但是在诸如scanf()之类的函数返回EOF之后,您可以合法地使用feof()ferror()来消除真正的EOF和文件流上的错误(例如磁盘崩溃或...(之间的歧义。

if (feof(stdin))
printf("EOF on standard inputn");
if (ferror(stdin))
printf("Error on standard inputn");

使用显示的代码,您通常应该看到"标准输入上的EOF";在标准输入上生成(甚至模拟(错误可能非常困难。 您不应该看到两条消息,并且应该始终看到其中一条消息。

相关内容

  • 没有找到相关文章

最新更新