2011-07-21 34 views
4

我有一個結構,包含字符串。類似的東西:使用fread/fwrite作爲STL字符串。這是對的嗎?

struct Chunk { int a; string b; int c; };

所以,我想,我不能寫和使用的fread和fwrite功能從文件中讀取這個結構。因爲字符串可能保留不同的內存容量 但這樣的代碼正常工作。

Chunk var;

fwrite(&var, sizeof(Chunk), 1, file);

fread(&var, sizeof(Chunk), 1, file);

是否真的有它的一些問題?

回答

8

你有理由懷疑這一點。您只應使用fwritefreadstring流式傳輸POD類型不是POD

+4

除此之外,指針是POD,但通常不會很好地序列化。 –

+0

謝謝@Ben,我的術語很寬鬆。 –

+3

而且您仍然需要警惕POD類型的對齊問題。對於'struct s {uint8_t c; uint64_t d};''sizeof(struct s)'可能不是9. – user786653

2

你不應該這樣做,因爲不同的實現使用std::string的不同結構。

一般來說,你只應該序列化整型,布爾類型,二進制數據(如果你可以稱之爲序列化)。如果您想在平臺之間共享序列化數據,請務必使用一個字節序。

小心浮動,雙打和指針。他們會變得非常討厭。

您必須留意C/C++結構,因爲它們可能包含不可預測的填充量。

+0

即使是結構體也是一個問題,因爲它們包含不可預知的填充量。如果您在同一個程序中讀取數據並寫入數據,這可能是確定的,但這絕對不是可移植的。你真的必須遞歸地逐個序列化結構成員。 –

+0

@Kerrek SB:好的,我會編輯它。 – orlp

相關問題