我試圖在這里和互聯網上的其他地方搜索答案,但沒有得到我正在尋找的東西。我有一個如下所示的資料檔案:
0,4
0,6
0,9
0,10
1,5
1,7
1,9
2,6
2,8
2,10
3,4
3,7
fscanf
我可以使用沒有任何問題的方式逐行讀取此檔案。但是,我不知道檔案中的行數。我嘗試使用 for 回圈進行大量迭代:
int u, v;
FILE *ptr = fopen("myfile.dat", "w");
for (int i=0; i < 1000000; i){
fscanf(ptr, "%d,%d\n", &u, &v);
}
fclose(ptr);
但是,這會在讀取前幾行之后重復讀取檔案的最后一行。為什么會這樣?以及如何正確解決我的問題,以便能夠正確讀取行數未知的檔案?
編輯:這是我在看到下面的一些答案后嘗試的最小作業示例。
#include <stdio.h>
int main(){ 檔案 *file_ptr_edges; file_ptr_edges = fopen("myfile.dat", "r"); 詮釋 u, v, eof; 詮釋 r = 1; 而 (r != EOF){ r = fscanf(file_ptr_edges, "%d,%d\n", &u, &v); printf("u = %d,v = %d\n", u, v); printf("%d\n", r); } fclose(file_ptr_edges);
return 0;
}
輸出:
u = 0,v = 4
2
u = 0,v = 6
2
u = 0,v = 9
2
u = 0,v = 10
2
u = 1,v = 5
2
u = 1,v = 7
2
u = 1,v = 9
2
u = 2,v = 6
2
u = 2,v = 8
2
u = 2,v = 10
2
u = 3,v = 4
2
u = 3,v = 7
2
u = 3,v = 7
-1
因此,當到達最后一行時r
似乎有價值。-1
這解決了我的問題,盡管我不明白 的值r
是如何變化的。
uj5u.com熱心網友回復:
您需要檢查fscanf
(以及您呼叫的所有其他回傳結果的標準庫函式)的結果。
如果在第一次轉換(如果有)完成之前發生輸入故障,則 fscanf 函式回傳宏 EOF 的值。否則,該函式回傳分配的輸入項的數量,如果發生早期匹配失敗,該數量可能少于提供的數量,甚至為零。
像這樣的東西應該作業:
while (fscanf(ptr, "%d,%d\n", u, v) == 2) {
// do something with the numbers
}
if (feof(stdin)) {
// the file was read to the end
} else {
// there was an error
perror ("Could not read the input");
}
另外,請閱讀遠離 scanf() 的初學者指南。
uj5u.com熱心網友回復:
您需要在fscanf()
回傳時終止回圈EOF
(檔案結尾):
int r = fscanf(ptr, "%d,%d\n", &u, &v);
if(r == EOF) break;
注意,u
僅對r > 0
和v
for有效r == 2
。我不知道你想要什么行為r == 0
或r == 1
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469128.html
上一篇:C正則運算式不匹配
下一篇:為什么將輸出寫入正在緩沖的管道