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

如何在C中使用fscanf()区分文件结尾和错误?,c,scanf,eof,feof,C,Scanf,Eof,Feof,根据手册,int fscanfFILE*stream,const char*format。。。返回成功匹配和分配的输入项的数量,该数量可以小于提供的数量,如果早期匹配失败,甚至可以为零。我应如何区分: 零匹配项和分配项 文件末尾 一个空文件? 例如,请参阅POSIX规范的“返回值”部分 fscanf报告零个匹配和分配的项目,返回0 fscanf报告文件结束并返回EOF 第一次调用fscanf返回EOF时会报告一个空文件 请注意,这一规定使我们很难区分没有字节的空文件和没有有用数据的文件。考虑这个

根据手册,int fscanfFILE*stream,const char*format。。。返回成功匹配和分配的输入项的数量,该数量可以小于提供的数量,如果早期匹配失败,甚至可以为零。我应如何区分:

零匹配项和分配项 文件末尾 一个空文件?
例如,请参阅POSIX规范的“返回值”部分

fscanf报告零个匹配和分配的项目,返回0

fscanf报告文件结束并返回EOF

第一次调用fscanf返回EOF时会报告一个空文件

请注意,这一规定使我们很难区分没有字节的空文件和没有有用数据的文件。考虑这个测试程序,我称之为EOF59. C,编译为创建EOF59:


显示代码后,您通常会看到“标准输入上的EOF”;即使在标准输入上模拟错误,也很难生成错误。您不应该同时看到两条消息,而应该始终看到其中一条消息。

例如,请参阅POSIX规范的“返回值”部分

fscanf报告零个匹配和分配的项目,返回0

fscanf报告文件结束并返回EOF

第一次调用fscanf返回EOF时会报告一个空文件

请注意,这一规定使我们很难区分没有字节的空文件和没有有用数据的文件。考虑这个测试程序,我称之为EOF59. C,编译为创建EOF59:


显示代码后,您通常会看到“标准输入上的EOF”;即使在标准输入上模拟错误,也很难生成错误。您不应该同时看到这两条消息,您应该始终看到其中一条消息。

Ok,因此如果fscanf返回0,则无法分配项目或文件为空,如果返回EOF,则文件为空或位于末尾,对吗?如果文件为空-无法读取任何内容-将返回EOF您可以在此处添加有关feof和ferror的正确用法:D@tomashauser-基本上,这是正确的。当fscanf遇到EOF时,除了跳过空白或格式字符串中的其他文字字符外,什么也没做,就得到了EOF。如果剩下一些数据,但我更新的答案中代码中的格式字符串(例如x%s)与输入不匹配,则得到0。运行一段时间是一种轻描淡写的说法。好的,因此如果fscanf返回0,则无法分配项目或文件为空,如果返回EOF,则文件为空或位于末尾,对吗?如果文件为空-无法读取任何内容-将返回EOF您可以在此处添加有关feof和ferror的正确用法:D@tomashauser-基本上,这是正确的。当fscanf遇到EOF时,除了跳过空白或格式字符串中的其他文字字符外,什么也没做,就得到了EOF。如果剩下一些数据,但我更新的答案中代码中的格式字符串(例如x%s)与输入不匹配,则得到0。运行一段时间是一种轻描淡写的说法。
#include <stdio.h>

int main(void)
{
    char buffer[256];
    int rc;

    while ((rc = scanf("%255s", buffer)) != EOF)
        printf("%d: %s\n", rc, buffer);
}
if (feof(stdin))
    printf("EOF on standard input\n");
if (ferror(stdin))
    printf("Error on standard input\n");