[問題] fscanf讀txt檔大量數值錯誤問題

看板C_and_CPP作者 (Sho)時間11年前 (2014/03/12 11:11), 編輯推噓5(5015)
留言20則, 8人參與, 最新討論串1/2 (看更多)
開發平台(Platform): VC++ 問題(Question): 使用fscanf讀取txt檔內的數值(double)並放入陣列 當fscanf執行到一定次數程式會崩潰 餵入的資料(Input): .txt檔 內容為單純數值用\t與\n分隔 Ex: 120.25 15687 0.568 4568 452.5 213.111 預期的正確結果(Expected Output): 讀入所有資料 錯誤結果(Wrong Output): windows已觸發XXX.exe之中斷點 http://imgur.com/Pf3qYvV
程式碼(Code):(請善用置底文網頁, 記得排版) for (i = 0; i < 8; i++) for (j = 0; j < 1024; j++) fscanf(f, "%lf", &matrix[i][j]; 補充說明(Supplement): buffer是沒問題的,用動態配置宣告 有另外直接寫入讀出測試過 fscanf的行為也正確 約執行8*900次是沒問題的,數值也正確 但大概在8*97X次時,就會發生不明的崩潰 不知道有沒有人遇過一樣的問題 或是有更好的讀法 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 27.243.75.56

03/12 11:14, , 1F
matrix的大小是?
03/12 11:14, 1F

03/12 11:23, , 2F
為1024*8的大小
03/12 11:23, 2F

03/12 12:05, , 3F
如果scanf讀到EOF呢
03/12 12:05, 3F

03/12 12:38, , 4F
可是還沒有讀到EOF就會出現該錯誤了
03/12 12:38, 4F

03/12 14:30, , 5F
動態宣告的部分打出來看一下 另外你那段code括號沒對稱..
03/12 14:30, 5F

03/13 20:32, , 6F
我猜你的matrix是用靜態宣告,我遇過float陣列因為這樣
03/13 20:32, 6F

03/13 20:33, , 7F
所以資料出錯,改成malloc就OK了
03/13 20:33, 7F
上面的CODE是直接打的,漏括號了,原CODE沒漏 下面是我動態宣告的方式(原CODE是double) int **data; data = (int**)new char [height * sizeof(int *) + width * height * sizeof(int)]; for (i = 0; i < height; i++) data[i] = (int *)data + height + i * width; 問題應該不是出現在BUFFER 我有用迴圈直接給值寫滿整個BUFFER,再讀出確認 是沒有問題的 ※ 編輯: ShoPeter 來自: 27.243.75.56 (03/14 14:06)

03/14 14:39, , 8F
為什麼不設中斷點去看?
03/14 14:39, 8F

03/14 15:02, , 9F
改成這樣試試
03/14 15:02, 9F

03/14 15:03, , 10F
int * index=(int *)(data+height);
03/14 15:03, 10F

03/14 15:03, , 11F
for (i = 0; i < height; i++, index += width)
03/14 15:03, 11F

03/14 15:03, , 12F
data[i] =index;
03/14 15:03, 12F

03/14 15:05, , 13F
如果這樣也不行,就得用debugger看底層運作了
03/14 15:05, 13F

03/14 21:56, , 14F
我有個疑問, sizeof(int*) 是 4 或 8 ?
03/14 21:56, 14F

03/14 21:57, , 15F
就是你跑的系統架構是32或64?
03/14 21:57, 15F

03/14 21:59, , 16F
如果只是要解決問題的話,既然用C++的new乾脆用container
03/14 21:59, 16F

03/14 22:03, , 17F
覺得記憶體宣告方式有點奇怪,可能問題還是出在這...
03/14 22:03, 17F

03/18 18:26, , 18F
動態配置那段, 如果是 32位元電腦, 用 int 可能不會發現錯誤;
03/18 18:26, 18F

03/18 18:27, , 19F
若是 double **data; 請驗證 (double *) data + height 和
03/18 18:27, 19F

03/18 18:27, , 20F
(double *) (data + height) 的差別.
03/18 18:27, 20F
文章代碼(AID): #1J7z1CdX (C_and_CPP)
文章代碼(AID): #1J7z1CdX (C_and_CPP)