2011-12-22 33 views
2

我的工作郵箱項目結構,我有這兩種結構:寫入和讀取(fwrite的 - FREAD)與指針

結構mmbox_mail

struct mmbox_mail { 
    char *sender, *recipient; 
    char *obj, *date; 
    char flags; 
    size_t size; 
}; 

mail_t

typedef struct{ 
    struct mmbox_mail info; 
    void *body; 
    void *next; 
} mail_t; 

我無法修改結構的字段,因爲我需要變量數據(爲此目的,我使用char *而不是char [])。

每個mail_t結構都是一封郵件。我需要將用戶的每封郵件保存在一個文件中,這可能是二進制文件或文本文件(但我認爲使用二進制文件更好,因爲我有void*正文,難以用純文本保存。我試圖做到這一點,但現在看來似乎不起作用:

while(mailtmp != NULL){ 
    fwrite(mailtmp, sizeof(mail_t), 1, fp); 

    /* next mail */ 
    mailtmp=mailtmp->next; 
} 
while(mailtmp != NULL){ /* i have a list of mails and i use a mailtmp pointer to save each mail */ 

你能幫助我,我試着到處尋找,但我從來沒有發現有人問,以節省二號呢?結構,一個在另一個內。

回答

0

你正在做的是將mail_t的文字二進制表示保存到文本文件中,這只是一堆指針。你想要做的事情是:

fprintf(fp, "To: %s\nFrom: %s\n....\nContents: %*s\n\n", mailtmp->info.recipient, mailtmp->info.sender, mailtmp->info.size, mailtmp->body); 

這將呈現值指向爲字符串並將其保存到文件。在應用程序關閉後,指向應用程序所在內存中的某個位置的指針對大多數人來說有點無用;)

編輯:「你能幫我嗎?我試圖到處搜索,但我從未找到要求保存的人兩個結構,一個在另一個裏面。「

如果你只有第一類的數據類型,如int或float等,你的方法將完美工作。但是,由於您使用的是第二類類型,即char和void數組,您必須實際指定應如何保存指向的數據。

+0

我試過這種方法,但我發現一個問題是:如何在純文本中保存void * body?我的意思是,電子郵件的正文可能是各種數據,所以我不能將它保存爲純文本。 O.o – user1111399 2011-12-22 09:47:51

+0

那麼電子郵件格式本質上是明文的。連接到電子郵件的二進制文件是base64'd,允許通過明文協議傳輸。你可以編寫一個解析器來從電子郵件中提取實際的文本;你可以解析出這些文件,解開它們,並將它們寫入文件;你可以做任何你想做的事。然而,你的問題的範圍並不包括這一點,完全取決於你決定如何去做這件事。 – Kaslai 2011-12-22 10:16:48

+0

對不起,但我是一個「自制」項目,我想在本地運行,而不是遠程..所以我正在尋找一些不太複雜的東西:)在未來,我將實現功能,使其遠程運行,但此刻我想讓它在本地工作.. :)無論如何,謝謝! :D – user1111399 2011-12-22 14:17:09

3

當然,它不會像字符串那樣工作,它會複製指針的大小(通常是4個字節)。我在這裏看到3個選項:

  1. 序列化數據,二進制文件(http://en.wikipedia.org/wiki/Serialization)。
  2. 創建格式以將數據存儲在文本文件中。
  3. 使用的標記語言,如XML/JSON等

在任何情況下,你需要通過結構的各個領域,以將其寫入數據文件。至於閱讀,在前兩種情況下,您必須完全按照您寫入數據的順序進行閱讀,在第三種情況下,您可以按任意順序獨立閱讀字段。

如果你選擇第一種方法,對於每一個字符串(字符*)字段寫入也是零終止字節,這樣你總是知道在哪裏讀它時,後端。

+0

好吧,我不能使用XML/JSON,ecc ..因爲我不知道:(我試圖創建一個格式來存儲數據(如保存發件人,然後保存收件人,然後保存數據,ECC ... ),但它似乎不是很有效率..(任何建議被接受.. :))順便說一句,我會尋找序列化.. :) – user1111399 2011-12-22 09:55:12

+0

序列化數據的想法是,你寫的部分完全在與您閱讀的順序相同。所以,e。 G。如果您需要存儲具有名稱,年齡,地址的客戶,則可以打開文件,而不打開EOF:寫入名稱(具有零終止字節),寫入時間(整數,4個字節),寫入地址(具有零終止字節) 。讀取將是:打開文件,而不是EOF:讀取字符,直到零字符到緩衝區(名稱),讀取4字節(年齡),讀取字符,直到零字符到緩衝區(地址)。 – dimir 2011-12-22 10:08:22

+0

好的。我知道了。今天,我再次寫這個程序,我保持聯繫。 :d(我的英語不好真的很抱歉.. :()非常感謝!d這裏系列化可能性 – user1111399 2011-12-22 13:33:16

0

好,你是存儲結構的指針到file.not數據點吧to.even您存儲結構,你want.it難以從文件中得到它。我認爲你需要一個序列化組件,如google protocal buffer。那麼你可以寫一個適配器,轉換結構來probuf對象,然後存儲它file.when你想,RETR it.hoping它會幫助你:)

+0

真的很感謝您的幫助!d但是,我想我已經與dimir的回答解決了..我說「我想「因爲我不確定.. – user1111399 2011-12-22 13:44:47