2011-11-05 110 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