在不移动文件指针的情况下检查文件指针是不是已达到 EOF?
Posted
技术标签:
【中文标题】在不移动文件指针的情况下检查文件指针是不是已达到 EOF?【英文标题】:Checking if the file pointer has reached EOF without moving the file pointer?在不移动文件指针的情况下检查文件指针是否已达到 EOF? 【发布时间】:2013-08-05 17:51:09 【问题描述】:我的问题很简单,但我在谷歌上找不到,所以我在这里。
基本上,作为一个例子,我正在从输入文件中读取一堆整数,直到 EOF。我使用 fgetc 进行检查,但随后它将文件指针移动到第二个整数的地址。如何在这个while循环中检查EOF而不在检查时移动文件指针?
请记住,我将使用这个循环做一些比扫描整数更复杂的事情。另外,我知道,不要提及我使用 fscanf 而不是 fgets。它只是一个简单的例子来告诉你我的意思。
while(fgetc(ifp) != EOF)
fscanf(ifp, "%d", &test);
printf("%d\n", test);
如果输入文件有整数 1-10,例如,上面的代码会打印:
2 3 4 5 6 7 8 9 10
错过了 1!
【问题讨论】:
因为fgetc(ifp)
会消耗一个字符
【参考方案1】:
fgetc
返回指定流的内部文件位置指示符当前指向的字符。然后内部文件位置指示器前进到下一个字符。使用do while();
将解决您的问题。
【讨论】:
因为dowhile();
先执行后测试。
请记住,对fgetc()
的调用将吞噬分隔整数的空白字符之一;虽然它确实有效。这对我来说很难闻......【参考方案2】:
您应该将 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);
特别是对于调试,最好将事物拆分为带有可检查变量的单独语句。
【讨论】:
【参考方案3】:由于各种原因,如果不实际执行文件的预先读取,就无法确定是否已达到 EOF。
但是,使用单独的函数调用来执行此操作是个坏主意,即使您要使用 ungetc()
来放回您尝试读取的字符。
相反,检查对fscanf()
本身的调用的返回值:
while(fscanf(ifp, "%d", &test) == 1)
printf("%d\n", test);
【讨论】:
【参考方案4】:简单地说:
while (fscanf (ifp, "%d", &test) != EOF)
printf("%d\n", test);
【讨论】:
不起作用:fscanf()
可能返回 EOF
,这是一个真实值【参考方案5】:
fgetc(ifp)
推进文件指针,从而跳过你的第一个整数
改为使用:-
while(1)
if(fscanf(ifp, "%d", &test)!=1)
break;
printf("%d\n", test);
【讨论】:
不,检查this @DavidRF 检查上下文,OP 案例不太具体while(!feof(ifp))
这是错误的,因为(在没有读取错误的情况下)它进入循环的次数比作者预期的多一次。如果出现读取错误,则循环永远不会终止。
你能给我一个导致无限循环的读取错误的例子吗?我只是好奇。
现在您的代码没有错误,但feof
没有任何意义:他的指标通常由流上的先前操作设置,该操作尝试在结束时或结束时读取-文件,只需使用while(fscanf(...) == 1)
【参考方案6】:
真正的答案是使用feof
https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/feof.htm
【讨论】:
以上是关于在不移动文件指针的情况下检查文件指针是不是已达到 EOF?的主要内容,如果未能解决你的问题,请参考以下文章
我应该如何在不使用 C++ 中的构造函数的情况下将值(不是指针)转换为子类?