2011-11-05 111 views
1

我在Fedora 15计算机上存在一条线,我有一个简单的代码看起来像这样的fscanf读取不以文件

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int x[50], y[50]; 
    int i; 
    FILE *f_in = fopen("readtest.dat","r"); 

    if (f_in == NULL) printf("No file...\n"); 
    else 
    { 
     i = 0; 
     while (!feof(f_in)) 
     { 
      fscanf(f_in,"%d %d",&x[i],&y[i]); 
      printf("%d %d\n", x[i], y[i]); 
      i++; 
     } 
     printf("I've read %d data.\n", i); 
    } 
return 0; 
} 

的文件被读的是这个

1 1 
2 2 
3 3 
4 4 
5 5 

但我不知道为什么输出看起来像这样。

1 1 
2 2 
3 3 
4 4 
5 5 
1250259108 1250140145 
I've read 6 data. 

我在想我在文件中留下了一个空白的新行,但我没有。我再次用gedit和vim检查了这个文件,没有找到空行。我为什么要阅读这条出现的线?

+2

http://c-faq.com/stdio/feof.html – user786653

回答

0

你应该在你的fscanf

fscanf(f_in,"%d %d\n",&x[i],&y[i]); 

而且不要忘记fclose文件

编辑

我尝试了一个新行转义字符和这里是结果。

没有\n

1 1 
2 2 
3 3 
4 4 
5 5 
-1216418984 1 
I've read 6 data. 

随着\n

1 1 
2 2 
3 3 
4 4 
5 5 
I've read 5 data. 
+0

这是问题,添加转义字符工作。但我不明白为什么。 – mmassaro

+0

'fscanf'处理所有空格字符相同,所以你可以只做'“%d%d”'。如果你真的想要逐行验证它是否正确完成,你应该使用'fgets',这是非常难以弄错的。 –

+0

关于白色空间的好处。我同意'fgets',但我只是想提供一个尽可能接近原始代码的工作答案。 – pnezis

3

可能最后一次致电fscanf功能失败。

这些函数返回分配的输入项的数量。如果匹配 失败,这可能会比规定的要少,甚至为零。

检查打印前的返回值。喜欢的东西:

v = fscanf(f_in,"%d %d",&x[i],&y[i]); 
if (v) { 
    // printf goes here 
} 
3

正如user786653说(参照,至少)在他的评论, “会!FEOF” 是错误方式用C. feof读取一个文件,直到文件结尾才会返回true,并且实际尝试读取它。所以你的程序做了额外的读取,失败了。

+0

+1为正确的答案(+1也是user786653的评论) – pmg