簡體   English   中英

fscanf()陷入無限循環

[英]fscanf() stucks in an infinite loop

我有一個包含整數矩陣的文件,如下所示:

1 2 -5
0 2 4
-2 –1 3

我需要知道矩陣中有多少元素(在本例中為9)。

計算元素數量的代碼如下:

while(!feof(pFile)) {

    fscanf(pFile, "%d", &voidElement);
    elements++;
}

由於某些原因,當fscanf讀取包含矩陣的文件中的數字-2時,代碼進入循環。

感謝您的幫助。

這是一個看起來像你的小程序,但工作(不會卡住 - 使用我的輸入文件)。 但是你會發現它有一個問題 - 繼續閱讀:

#include <stdio.h>

int main(void) {
  int i, el=0;
  FILE* fp;
  fp = fopen("nine.txt","r");
  while(!feof(fp)) {
   fscanf(fp, "%d", &i);
   el++;
   printf("element %d = %d\n", el, i);
  }
  fclose(fp);
}

輸出:

element 1 = 1
element 2 = 2
element 3 = -5
element 4 = 0
element 5 = 2
element 6 = 4
element 7 = -2
element 8 = -1
element 9 = 3
element 10 = 3

換句話說 - 這樣做你會獲得比你預期更多的元素 - 因為在你嘗試閱讀過去的文件結束之前,不會設置feof標志。

換句話說 - 你的方法並不好; 實際應該檢查fscanf是否成功,並僅計算那些(成功讀取)。

更好的技術是:

#include <stdio.h>

int main(void) {
  int i, el=0;
  FILE* fp;
  fp = fopen("nine.txt","r");
  while(1) {
   if(fscanf(fp, "%d", &i)!=1) break;
   el++;
   printf("element %d = %d\n", el, i);
  }
  fclose(fp);
}

還有一件事 - 如果fscanf由於任何原因而失敗(可能文件中存在錯誤的字符),它將永遠不會到達文件的末尾並且永遠不會設置EOF標記。 這可能是你的代碼實際上進入無限循環的原因 - 為什么第二種方法(當fscanf沒有成功讀取一個值時退出循環)將起作用。

編輯時,我按照我自己的評論中的建議(采取輸入文件並執行十六進制轉儲)使用上面的數字(最初我剛剛將數字鍵入文本文件,事情工作正常...)我看到以下:

hexdump -C typedNumbers.txt 
00000000  31 20 32 20 2d 35 0a 30  20 32 20 34 0a 2d 32 20  |1 2 -5.0 2 4.-2 |
00000010  2d 31 20 33 0a                                    |-1 3.|
00000015

hexdump -C copiedNumbers.txt 
00000000  31 20 32 20 2d 35 0a 30  20 32 20 34 0a 2d 32 20  |1 2 -5.0 2 4.-2 |
00000010  e2 80 93 31 20 33 0a                              |...1 3.|
00000017

請注意,第一行在兩個文件中都是相同的 - 但在第二個文件(原始文件)的第二行中有“不可打印”的字節。 特別是,字節是

e2 80 93    before 31

代替

2d 31

令我困惑的是,看到三個角色最終被一個emdash代表 - 我必須承認我不明白這是怎么做的。 但是,正如我在早期版本的答案中所推測的那樣,你的“隱藏的角色”很多。

我知道我的代碼存在問題(請參閱Floris的回答 )但主要問題是實際上第7個元素之前的減號不是真正的減號( -不同,你會注意到它如果你放大足夠)。

這導致循環甚至在到達EOF之前就退出了(實際上當fscanf試圖讀取–1時它有問題)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM