根据手册,int fscanf(FILE *stream, const char *format, ...)
返回成功匹配和分配的输入项数,该数可以少于规定的值,在早期匹配失败的情况下甚至为零。我该如何区分:
- 零匹配和分配的项目
- 文件结尾
- 空文件?
例如,请参阅 POSIX 规范的"返回值"部分以了解fscanf()
。
-
零匹配和分配的项目由返回 0 的
fscanf()
报告。 -
返回 EOF 的
fscanf()
报告文件结束。 -
第一次调用返回的 EOF
fscanf()
报告空文件。
请注意,该处方使得很难发现空文件(无字节(和没有有用数据的文件之间的区别。 考虑这个测试程序(我称之为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";在标准输入上生成(甚至模拟(错误可能非常困难。 您不应该看到两条消息,并且应该始终看到其中一条消息。