讓我們看看你的struct
,並考慮它有多大。
struct book {
unsigned short size_of_content;
unsigned short price;
unsigned char *content;
};
的第一項是一個unsigned short
,沒問題,sizeof(unsigned short)
大概將是2,如2個字節。同樣的下一個。
但是那第三個。這是一個指向unsigned char
......你的磁盤記錄不可能保存指針。你有一個字段size_of_content
...我的猜測是,磁盤記錄包含size_of_content
,然後price
,然後是實際內容。
我不會寫的完整代碼給你,但它的僞代碼是這樣的:
fread(&size_of_content, sizeof(size_of_content), 1, infp)
sanity-check the value of size_of_content and handle any error
fread(&price, sizeof(price), 1, infp)
sanity-check teh value of price and handle any error
buff->content = malloc(size_of_content)
check for error on malloc and handle any error
fread(buff->content, size_of_content, 1, infp)
如果你沒有一個堅硬和快速的規格有多大的含量假設它不會超過十億或類似的東西,並確保這個數字至少不是那麼大!總是檢查錯誤。
由於struct
只有兩個字段,所以每個字段只有fread()
相當簡單。如果你有更復雜的結構,它可能是值得使用結構:
struct book_header {
unsigned short size_of_content;
unsigned short price;
};
struct book {
struct book_header header;
unsigned char *content;
}
然後你可以使用fread()
與sizeof(book_header)
讀取整個頭一氣呵成。在使用波形音頻文件等二進制文件時,我已經寫了很多這樣的代碼。
你可能不需要擔心這個,但是這將是一個問題,如果該文件是寫的「大端」計算機上,並在「小端」計算機,或副閱讀-versa。
http://en.wikipedia.org/wiki/Endianness
如果確實有這樣的問題,解決的辦法就是標準化。選擇一個(小端或大端)並使用C庫函數來確保使用該端序來編寫和讀取數字。例如,htonl()
庫函數在寫入時和ntohl()
時讀取。
http://linux.die.net/man/3/htonl
但正如我所說,你也許並不需要擔心這個。
您嘗試讀取的文件的格式是什麼? – Maxpm
@Maxpm可能是任何東西,但我有的測試文件是一個bin文件。 – Pig
閱讀並理解寫入文件的功能,然後您將知道如何閱讀它。 – alk