2012-05-31 97 views
1

我很新的C,但我也碰到過用fread一個問題...C,從bin文件FREAD二進制

我的最終目標是從閱讀(然後printf的安慰)二進制一個.bin文件,但現在我把它一步步的時間,並試圖剛剛讀第一位......

我的代碼:

... 
FILE *file = fopen("test1.bin", rb); 
int i = 0; 
fread(&i, 1, 1, file); 
printf("%i\n", i); 
... 

現在我已經在嘗試這樣做三個不同的.bin文件,一個輸出0,另外兩個和另外12個!

爲什麼當我從文件中讀取1位時,它會輸出2/12?它不應該是0還是1?我究竟做錯了什麼?非常感謝。

+4

您正在閱讀1字節,而不是1位。 :) – Pethical

+0

對,好吧謝謝,如果我只想讀取32位,我會改變1,1,1,1,1,1? –

+2

更好地更改爲sizeof(int),1。 – Pethical

回答

6

更改fread()調用:

fread(&i, sizeof(int), 1, file); 

第二個參數是讀取一個元件的尺寸,第三個參數是元件讀取的數目。發佈的代碼是將單個字節讀入int

您還應該檢查來自fopen()fread()調用的返回值,以確保它們成功。

1

像@hmjd說的,你應該讀取填充int值所需的字節數。因此,無論這種方式:

len = fread(&i, sizeof(int), 1, file); 

或這種方式:

len = fread(&i, 1, sizeof(int), file); 

第一殼體讀取一個int值(通常爲4個字節)。通話結束後,如果讀取成功,len應該等於1。

第二種情況是將多個字節讀入一個int值。不同之處在於此次通話後,len應該等於sizeof(int)

無論哪種方式都可以工作,唯一的區別是,第一方式指定讀取多字節單個對象(int),而第二指定要讀入對象的字節數。這是一個微妙的差異,當然,人們會不同意最好。

第二種方法的優點是len告訴你究竟有多少字節被實際讀取(這可能對調試I/O錯誤很有用)。第一種方法的優點在於它對於成功來說是一個概念上更簡單的測試(是否有一個int被讀取?)。

但是不管你怎麼做,你都應該檢查返回值fread()