[爆卦]Fscanf 陣列是什麼?優點缺點精華區懶人包

為什麼這篇Fscanf 陣列鄉民發文收入到精華區:因為在Fscanf 陣列這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者ShoPeter (Sho)看板C_and_CPP標題[問題] fscanf讀txt檔大量數值錯...



開發平台(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
azureblaze:matrix的大小是? 03/12 11:14
ShoPeter:為1024*8的大小 03/12 11:23
x000032001:如果scanf讀到EOF呢 03/12 12:05
ShoPeter:可是還沒有讀到EOF就會出現該錯誤了 03/12 12:38
pcyu16:動態宣告的部分打出來看一下 另外你那段code括號沒對稱.. 03/12 14:30
lc85301:我猜你的matrix是用靜態宣告,我遇過float陣列因為這樣 03/13 20:32
lc85301:所以資料出錯,改成malloc就OK了 03/13 20:33

上面的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)
loveflames:為什麼不設中斷點去看? 03/14 14:39
loveflames:改成這樣試試 03/14 15:02
loveflames:int * index=(int *)(data+height); 03/14 15:03
loveflames:for (i = 0; i < height; i++, index += width) 03/14 15:03
loveflames: data[i] =index; 03/14 15:03
loveflames:如果這樣也不行,就得用debugger看底層運作了 03/14 15:05
dirkc:我有個疑問, sizeof(int*) 是 4 或 8 ? 03/14 21:56
dirkc:就是你跑的系統架構是32或64? 03/14 21:57
dirkc:如果只是要解決問題的話,既然用C++的new乾脆用container 03/14 21:59
dirkc:覺得記憶體宣告方式有點奇怪,可能問題還是出在這... 03/14 22:03
yvb:動態配置那段, 如果是 32位元電腦, 用 int 可能不會發現錯誤; 03/18 18:26
yvb:若是 double **data; 請驗證 (double *) data + height 和 03/18 18:27
yvb:(double *) (data + height) 的差別. 03/18 18:27

你可能也想看看

搜尋相關網站