文件结束标记/文件扫描

时间:2011-04-16 19:22:30

标签: c file-io

我遇到文件扫描问题,这两个表达式是否以它们运行的​​方式相互对等?

#include <stdio.h>
FILE *point;
int number

 while ( fscanf(point, "%d", &number) != -1)

 while ( !feof(point) )

(测试文件):

39203 Thao Nguyen

92039 Steven Gonzales

出于某种原因,第一个语句对我有用,但是第二个语句只给了我一个seg错误,因为它在没有剩下要读的时候继续读取文件。

我尝试了第三种方式

 while ( point != EOF) // but this gives me a error of integer to pointer error 

3 个答案:

答案 0 :(得分:1)

EOF是stdio.h中定义的常量,通常为-1。这就是第一个恰好适合你的原因。然而,使用文字-1是不好的做法,因为实际上理论上可以定义EOF但是它想要。所以你真的想要按照while ( fscanf(point, "%d", &number) != EOF )

的方式做点什么

请参见fscanf手册页:

http://www.kernel.org/doc/man-pages/online/pages/man3/scanf.3.html

答案 1 :(得分:1)

不,这两个不一样:

while ( fscanf(point, "%d", &number) != -1)
while ( !feof(point) )

fscanf can return EOF(你应该使用而不是-1)有多种原因:

  

如果输入在第一次匹配失败或转换之前结束,则返回EOF。如果发生任何错误,则应返回EOF,并设置 errno 以指示错误。

但是feof

  

当且仅当为流设置了文件结束指示符时, feof()函数才会返回非零值。

答案 2 :(得分:0)

第一个声明:

while ( fscanf(point, "%d", &number) != -1)

将最终消耗文件的内容(当fscanf在大多数情况下返回-1时,即EOF),同时:

while ( !feof(point) )

只会给你无限循环,因为feof只是检查它是否是文件的结尾。你需要有一些东西让文件位置指针向前移动。

while ( point != EOF)

会给你和错误,因为point是指向FILE结构的指针,而EOF是一个int(只要EOF在大多数时间定义)

相关问题