2012-10-26 49 views
0

閱讀的二進制文件,我用C奇詭在用C

FILE *gfp; 
gfp = fopen(gridfiles, "wb"); 

像這樣定義一個二進制文件中的變量gridfiles存儲文件的名稱,並在前面已經定義。現在我寫出兩個變量到文件中。

for(yy = 0; yy < nfiley; yy++) { 
    for(xx = 0; xx < nfilex; xx++) { 
     filebx = beguv + xx*1E3; 
     fileby = enduv - yy*1E3; 
     fwrite(&filebx, sizeof(filebx), 1, gfp); 
     fwrite(&fileby, sizeof(fileby), 1, gfp); 
    } 
} 

如果此代碼之後我

fseek(gfp, 0, SEEK_SET); 
fread(&filebx, sizeof(filebx), 1, gfp); 
fread(&fileby, sizeof(fileby), 1, gfp); 
fprintf(stderr, "%f %f", filebx, fileby); 

我的輸出是

1000 15000 

前兩個,這是符合市場預期。

但是如果經過一番各種其他的代碼(即完全不涉及這些文件)我重複FSEEK()等等,我的輸出是

14000 14000 

,無論我做什麼。 我一直試圖弄清楚這一點現在......任何人都知道我在做什麼錯了?

+0

你打電話給'fflush'嗎? –

+0

我剛剛添加它,並再次運行它...相同的結果! fflush()並不適用於fread,是嗎? – Kitchi

+1

你知道從寫模式打開的文件讀取UB是正確的嗎?你應該讓它變成'fopen(gridfiles,「wb +」);'如果你打算讀寫。 –

回答

5

它是Undefined Behaviour從已經在寫入模式下打開的流中讀取。你應該這樣做:

gfp = fopen(gridfiles, "wb+"); 

如果你打算同時讀寫。

另外,正如@Kyle Jones在上面的評論中指出的那樣,您應該養成在做文件I/O時檢查fread/fwrite的返回狀態的習慣 - 這會讓您的問題早得多。