2010-10-28 65 views
1

我在C程序中有一個複雜的結構,它具有許多動態分配內存的成員。如何將此結構寫入文本/二進制文件?我將如何能夠從文件讀取的數據中重新創建整個結構。如何將動態分配的結構寫入文件

struct parseinfo{ 
int varcount; 
int termcount; 
char **variables; 
char **terminals; 
char ***actions; 
}; 

成員變量,終端和行動都是動態分配的,我需要這個結構寫入一個文件,這樣我可以在以後重建的結構。

+1

Hi @ user490648歡迎來到Stackoverflow。我鼓勵你閱讀http://stackoverflow.com/questions/how-to-ask,看看我們如何能夠幫助你! – jcolebrand 2010-10-28 21:59:29

回答

1

下面是二進制序列化的一些建議:

可以序列通過寫大小其次是內容的字符串,要麼是一拉C(寫終止「\ 0」)或 (即int) 。

您可以通過寫入字符串 後跟字符串的長度來序列化字符串數組。

如果有可能您在不同的 體系結構上反序列化文件(不同的int大小,不同的字節順序...),那麼請謹慎地指定文件的二進制格式。在這種情況下 你可能想看看XDR serialiaztion標準。

對於ASCII序列化,我喜歡JSON格式。

+0

非常感謝你埃德加。我發現JSON(或XML)適合我的需求,因爲我只存儲ASCII數據。再次感謝。 – farhanhubble 2010-10-30 08:59:41

4

您必須編寫這種結構序列化和反序列化功能,因爲你已經在堆上分配的指針,這沒有任何意義,以節省文件這個值,你可以不寫這個結構文件作爲原始數據。

+1

+1。某些類型的序列化/反序列化邏輯是必需的。 [Google Protocol Buffers](http://code.google.com/p/protobuf/)是一個用於此目的的庫,可用於C++。我相信還有很多其他人。 – 2010-10-28 22:05:52

+0

我知道有必要序列化我的結構。現在我已經解決了一個簡單的格式,其中存儲'varcount',然後'變量'的每一行都存儲在一個新行中。同樣適用於其他領域。我搜索了很多,發現XML和JSON是我所需要的。我將修改我的源代碼以便將來使用其中的一個。感謝您的答覆。 – farhanhubble 2010-10-30 09:01:43

0

我建議這樣做的方式是考慮在第一個地方創建項目需要什麼?

當涉及到char **variables; char **terminals; char **actions你顯然將不得不弄清楚如何聲明和閱讀它們,但我不認爲你可以注入一個/ 0到一個文件(EOF字符??)

您希望如何將其寫入文件?你能提供一個你認爲應該存儲的樣本輸出嗎?也許一個文件每行一個項目?它需要是一個二進制文件嗎?

+0

實際上,你可以在文件中寫入''\ 0''字節,或者你想要的任何其他'char'值。如果這樣做,嘗試在用於文本文件的查看器中查看文件可能沒有用處。否則,這篇文章會提出一些很好的問題,讓你開始思考。 – aschepler 2010-10-28 22:13:30

+0

嗨@aschepler,在我還是在他?我不確定那個'\ 0',所以非常感謝。 – jcolebrand 2010-10-28 22:25:55

+0

謝謝drachenstern.There有兩種選擇 - 使用我自己的格式,通過存儲字段寬度後跟數據或使用通用格式來處理任意數據結構,如XML或JSON。由於我手頭沒有太多時間,我正在使用自己的格式,並希望將來可以使用XML或JSON。 – farhanhubble 2010-10-30 09:00:29

2

短:不是以自動方式。

實質上,它高度依賴於你的結構的語義。 如果裏面的數據字段指定裏面的某些數組的長度,您可以重建結構。 但是,你必須小心「看好」這些價值觀。 (可能的原因是堆棧溢出(好詞)),如果您認爲數組中有2^34個條目。 但是,否則它只是去每個成員(疼痛)

你可以搜索一些關於ASN.1和TLV結構。

+0

如果可以,請避免使用ASN.1!使用起來並不好玩。 – 2010-10-28 22:08:58

+0

非常感謝RobKop,我現在正在做你的建議。 – farhanhubble 2010-10-30 09:01:23