2015-02-09 59 views
0

我不明白爲什麼這個小C代碼不起作用FREAD()函數給出了垃圾

#include <stdio.h> 

main(int argc,char **argv){ 
    FILE *fp, 
    int i; 
    size_t elem_read; 
    int buffer[100]; 
    fp=fopen(argv[1],"r"); 
    elem_read=fread(buffer,sizeof(int),100,fp); 
    for(i=0;i<elem_read;i++) 
      fprintf(stderr,"%d\t",buffer[i]); 
    fclose(fp); 
} 

爲了縮短我沒有做任何錯誤檢查的代碼,但它應該工作...我已經用txt和bin文件試着讀取數字並將其打印出來。我想我明白爲什麼這不適用於txt文件,但我不明白爲什麼它不與.bin文件?我有一個包含4個整數的文件:10 10 10 10,但是當我嘗試使用./a.out file.bin運行它時,我得到一些隨機數字(垃圾輸出),問題在哪裏?

+0

該文件的內容是什麼? – 2015-02-09 18:05:27

+0

@iharob 10 10 10 10 – BsD 2015-02-09 18:06:01

+0

Text? '10 10 10 10'? – 2015-02-09 18:06:50

回答

6

它不與.bin文件工作的原因是,如果你可以在你的文本編輯器中看到10 10 10 10,你已經有了一個.bin擴展名的文件。但是,您讀取的值不是「垃圾」,它們是代表文件編碼中文本的字節,重新解釋爲整數。

爲了讀取數字早在int s,寫入寫入二進制數到一個文件,這樣

FILE *fp = fopen("test", "wb"); 
int[] data = {10, 10, 10, 10}; 
fwrite(data, sizeof(int), sizeof(data)/sizeof(int), fp); 
fclose(fp); 

程序,然後使用你的程序來閱讀。

+0

@Jongware你是對的,謝謝! – dasblinkenlight 2015-02-09 18:16:49

+0

有趣...它雖然工作,謝謝! – BsD 2015-02-09 18:22:49

+2

**重要注意事項:**當訪問(讀取,寫入或同時使用二進制文件)時,請在模式中添加「b」(即使用「rb」或「wb」),否則數據可能會損壞。這是因爲只有「r」可能(例如---實際取決於OS)將CRLF(源中的「0D」,「0A」)轉換爲LF(「0A」)---換句話說, 。在舊的Mac OS系統中,它會將CR轉換爲LF('0D'->'0A')。在處理文本文件時,我總是以二進制模式自己讀取,並手動處理可能的行尾;如果用戶給你的文件提供了不正確的(甚至是混合的)行結尾,那麼就不會出錯。 – 2015-02-09 18:27:11