我的问题很简单,但我无法在谷歌上找到它,所以我在这里。
基本上,作为一个例子,我正在读取一堆整数,直到输入文件中的EOF。我使用fgetc来检查,但随后它将文件指针移动到第二个整数的地址。如何检查此while循环中的EOF而不检查文件指针?
请记住,我将使用此循环执行比使用整数扫描更复杂的操作。另外,我不知道我使用fscanf而不是fgets。它只是一个简单的例子,向您展示我的意思。
while(fgetc(ifp) != EOF)
{
fscanf(ifp, "%d", &test);
printf("%d\n", test);
}
如果输入文件有例如1-10的整数,则上面的代码将打印:
2 3 4 五 6 7 8 9 10
缺少1!
答案 0 :(得分:7)
fgetc
返回指定流的内部文件位置指示符当前指向的字符。然后内部文件位置指示器前进到下一个字符。使用do{ }while();
将解决您的问题。
答案 1 :(得分:5)
您应该将EOF条件视为实施细节。这里真正重要的是fscanf是否成功返回了一个值。
while(fscanf(ifp, "%d", &test) == 1) {
printf("%d\n", test);
}
另一方面,这感觉就像把逻辑放在循环中间那样有意义的时候。
while(1) {
int ret = fscanf(ifp, "%d", &test);
if (ret != 1)
break;
printf("%d\n", test);
}
特别是对于调试,将事物拆分为可以检查的变量的单独语句可能会很好。
答案 2 :(得分:3)
由于各种原因,如果没有实际执行文件的先前读取,就无法确定是否已达到EOF。
但是,使用单独的函数调用来执行此操作是个坏主意,即使您使用ungetc()
来放回您尝试阅读的字符。
相反,请检查对fscanf()
本身的调用的返回值:
while(fscanf(ifp, "%d", &test) == 1)
{
printf("%d\n", test);
}
答案 3 :(得分:3)
简单地说:
while (fscanf (ifp, "%d", &test) != EOF)
printf("%d\n", test);
答案 4 :(得分:2)
fgetc(ifp)
推进文件指针,因此跳过你的第一个整数
相反使用: -
while(1)
{
if(fscanf(ifp, "%d", &test)!=1)
break;
printf("%d\n", test);
}
答案 5 :(得分:0)