C如何处理EOF?

C如何处理EOF?,c,feof,C,Feof,我希望得到 abcdef 6 abcdef 13 abcdef 19 我做错了什么?feof不会告诉您已经点击了文件的结尾,直到您点击了文件的结尾。检查fscanf中的结果(返回值)。当它不能再阅读时,它会告诉你。如果fscanf命中文件末尾,它将返回EOF(并且feof在发生此情况后将返回true) 现在,为了好玩,看看这种方法。不要这样做 abcdef 6 abcdef 13 15 这种方法是错误的,因为它很聪明。再多一些情况下,循环作为一个整体的行为将变得非常难以识别(例如)。使用fs

我希望得到

abcdef 6
abcdef 13
abcdef 19

我做错了什么?

feof
不会告诉您已经点击了文件的结尾,直到您点击了文件的结尾。检查
fscanf
中的结果(返回值)。当它不能再阅读时,它会告诉你。如果
fscanf
命中文件末尾,它将返回EOF(并且
feof
在发生此情况后将返回true)

现在,为了好玩,看看这种方法。不要这样做

abcdef 6
abcdef 13
15
这种方法是错误的,因为它很聪明。再多一些情况下,循环作为一个整体的行为将变得非常难以识别(例如)。使用
fscanf
时,您只需知道是否获得了继续操作所需的所有数据。让下一个输入读取函数在找到EOF时处理它。对
fscanf
的调用需要填充x个值

while(1) {
    switch(fscanf(f,"%s",a)){
        case 1: 
            printf("%s ",a);
            printf("%d\n",ftell(f));
            continue;
        case EOF:
            break;
    }
    break;
}

然后执行错误响应,或者退出循环,或者执行程序下一步需要执行的任何操作。但是如果
fscanf
返回3以外的任何值,它不会读取3个值。

测试I/O操作本身;除非您正在编写Pascal(而C不是Pascal!),否则不要使用feof()

使用
%s
,转换不会失败,I/O错误也不太可能发生。但是,如果转换说明符是
%d
,则数据中的标点符号可能会导致“转换失败”


在长达25年的C代码编写过程中,我的代码中有两个地方使用了数千个文件中的
feof()
(我几个月前做过),在这两种情况下,代码都在区分EOF和error(大致如图所示).

feof
可能无法像您认为的那样工作。请向我们解释这种方式的错误,以便我们知道如何做不同的事情,我投您一票。好的。我试过了。我想我在写这篇文章的时候成熟了一点WTF有一个只循环一次的循环,这与这个问题无关。考虑<代码> INT FO;对于(foo=fscanf(stdin,“%s”,bar);foo==1;foo=fscanf(stdin,“%s”,bar)){printf(“%s\n”,bar);}。。。在这个循环之后,可以检查返回的值,看看是匹配失败(对于这个格式字符串,这是不可能发生的)还是导致fscanf返回1以外的内容的读取失败。我不明白你在这里说什么。WTF在哪里?我想我想说的是:目标是教人们如何以正确的方式做事,而不是教人们什么是不正确的方式。“WTF”是对名为“每日WTF”的网站的引用。ftell()参数的格式说明符错误
ftell()
返回一个
long
,而不是
int
@Wiz:true;我抄袭了问题,没有仔细检查这句话的内容。我来修理;谢谢
while(1) {
    switch(fscanf(f,"%s",a)){
        case 1: 
            printf("%s ",a);
            printf("%d\n",ftell(f));
            continue;
        case EOF:
            break;
    }
    break;
}
if (fscanf(f,"%d %d %d", &i, &j, &k) != 3)
    /* cannot continue. need i j k values for next computation */
#include <stdio.h>

int main(void)
{
    FILE *f = fopen("book2.txt", "r");
    char a[200];
    if (f != 0)
    {
        while (fscanf(f, "%199s", a) == 1)
        {
            printf("%s ", a);
            printf("%ld\n", ftell(f));
        }
        putchar('\n');
        fclose(f);
    }
    return 0;
}
#include <stdio.h>

int main(void)
{
    FILE *f = fopen("book2.txt", "r");
    char a[200];
    if (f != 0)
    {
        while (fscanf(f, "%199s", a) == 1)
        {
            printf("%s ",a);
            printf("%ld\n", ftell(f));
        }
        putchar('\n');
        if (feof(f))
            printf("EOF\n");
        else if (ferror(f))
            printf("I/O error\n");
        else
            printf("Conversion failed\n");
        fclose(f);
    }
    return 0;
}