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;
}