2014-02-12 73 views
4
struct book 
{ 
    unsigned short size_of_content; 
    unsigned short price; 
    unsigned char *content; 
}; 

假設我有文件,其中包含多個book S,每個人都有不同的size_of_contentpricecontent。我怎樣才能一次讀出一個book,並確定它是哪本書(例如檢查價格)?如何fread()結構?

size_t nread2; 
struct book *buff = malloc(sizeof(struct book)); 
while((nread2 = fread(buff, sizeof(struct book), 1, infp)) > 0) 
{ 
    printf("read a struct once \n"); 
} 

這是我到目前爲止。每當我讀取結構時,我都試圖打印。但是,當我嘗試了5個結構的輸入文件時,它將打印15次...

謝謝。

+0

您嘗試讀取的文件的格式是什麼? – Maxpm

+0

@Maxpm可能是任何東西,但我有的測試文件是一個bin文件。 – Pig

+1

閱讀並理解寫入文件的功能,然後您將知道如何閱讀它。 – alk

回答

7

讓我們看看你的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

但正如我所說,你也許並不需要擔心這個。

+0

這只是一個任意的問題,內容的實際大小不會很大? – Pig

+0

我無法猜測內容的實際大小有多大,但我不希望它很大。你可以看看輸入文件的大小,並且你知道它必須是五個記錄,所以它們可能大約是文件大小的1/5或類似的東西。 – steveha

+0

非常感謝!有一件事我仍然不確定,因爲文件中有多本書,fread怎麼知道要找哪一本書? – Pig