我遇到文件扫描问题,这两个表达式是否以它们运行的方式相互对等?
#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
答案 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在大多数时间定义)