[英]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.