2011-08-17 29 views
2

我有這樣的事情,其實更復雜的結構比這如何保存動態結構到文件

typedef struct _sample { 
    unsigned char type; 
    char *name; 
    test *first; 
} sample; 
typedef struct _test { 
    test *prev; 
    test *next; 
    char *name; 
    int total; 
    test_2 **list; 
} test; 
typedef struct _test_2 { 
    char *name; 
    unsigned int blabla; 
} test_2; 
sample *sample_var; 

我想備份這個結構到一個文件後恢復它。

我也嘗試fwrite(sample_var, sizeof(sample), 1, file_handle);,但真正的問題是sizeof(sample)返回錯誤的大小,而不是實際的可變大小。

有一種方法可以將它保存到文件中&恢復不知道大小?

+0

@OP是否讓我們知道它是否可以使用。 – cnicutar 2011-08-17 12:08:51

回答

4

您正在嘗試序列化或marshal的結構。你不能只是fwrite的數據(有指針是最明顯的塞子)。與相比,sizeof問題確實很小,將指針存儲在文件中(指針在源程序之外是無意義的)。

你將不得不定義你自己的序列化/反序列化函數。你可以使用自己的簡單格式或使用JSON,XML,XDR或類似的東西。

就我個人而言,我會選擇使用JSON,因爲無論如何,這些天都是憤怒。

順便說一下,這裏有一個與你自己的問題有聯繫的C FAQ(雖然它討論了互操作性問題)。

0

sizeof(sample)不正確:它返回一個字符的大小,後面跟兩個指針。如果您需要保存這種遞歸數據類型,則必須手動遵循取消引用指針。

+0

「它返回一個字符的大小,後跟兩個指針」**和編譯器選擇插入成員之間和/或最後一個成員之後的任何填充字節** – pmg 2011-08-17 11:48:59

0

看來你真正想要做的就是存儲結構,它的指針指的是指針,而不是指針本身。

您將需要編寫一些邏輯來確定所指向的數據的大小,並將該數據寫入文件而不是指針。

1

沒有簡單的方法將這樣的結構保存到文件中。例如,即使sample.name字段的大小爲4(取決於架構),而您可能想要保存的是sample.name指向的內存內容。

這是一個示例代碼,將做這樣的事情。您將不得不復制流程以保存整個結構。

void saveToFile(FILE *fh, sample s) 
{ 
    fwrite(s.type, sizeof(char), fh); 
    int nameSize = strlen(s.name); // get the length of the name field 
    fwrite(nameSize, sizeof(size_t), fh); // write the length of the name field 
    frwite(s.name, nameSize * sizeof(char), fh); // write the content of the name field 
    // continue with other fields 
} 

這個想法是存儲下一個結構的大小,然後寫內容。要從文件中獲取信息,請先閱讀大小,然後獲取數據。