2012-09-28 157 views
1

的數組c寫入和讀出的文件I具有在C數據結構,它是結構的指針數組:與結構指針

struct trex *trex_arr[128]; 

struct trex{ 
    struct trex *next; 
    char name[LEN]; 
    unsigned int id; 
    int groups[LEN]; 
    struct list *filenames; //linked list 
    unsigned int fn_len; 
}; 

欲寫入文件陣列。我知道我需要在「下一個」指針和鏈接列表中的每個元素中寫入對象,但是我該怎麼做才能將它成功讀回到原始數組中(數組中有鏈接以及)?

+0

最簡單的方法是序列化並將其反序列化爲XML,但對於C語言,您需要一個庫支持。如何使用標題?然後你知道你遇到了這個對象的鏈表,並相應地創建你的鏈表。這是你的問題還是我誤解了它? –

+0

你使用頭文件的意思是什麼? – user1190650

+0

在您的輸出文本文件中,放置一些表示鏈接列表開頭的標識符。它應該保持唯一的數據,以便每當遇到這樣的數據時,您的程序就會知道鏈接列表正在啓動。 –

回答

1

隨口說說,這樣做是編寫結構出順序,這樣最簡單的方法:

[trex item #1] 
[list item #1] 
[list item #2] 
[list item #3] 
[trex item #2] 
[list item #1] 
[list item #2] 
[list item #3] 
[list item #4] 
etc... 

(當然,這只是排序它的JIST的這些都是二進制寫,這是隻有視覺)

我希望fn_len描述了鏈接列表struct list *filenames中的項目數。如果是這樣,這很簡單。

在寫作:

  1. 寫出在trex鏈表
  2. 循環的第一結構,同時寫出從第一trex結構之一struct list *filenames
  3. 重複#1對下一個項目在trex鏈接列表中,直到列表耗盡。

閱讀,請記住:所有指針都將是毫無價值的最初。你必須自己縫合在一起。但是結構在文件中以正確的順序排列。

  1. 閱讀第一個trex結構。你知道它的大小,讀它不是問題。將next指針修復爲空。
  2. 循環並逐個讀取每個struct list *filenames。你知道他們有多少是因爲剛剛閱讀的結構中有fn_len。將該鏈表拼接在一起並將其附加到trex結構。
  3. 重複#1與下一個trex結構,直到EOF,根據需要將結構連接到鏈表的末尾。

而且應該照顧它。

+0

非常感謝後,這真​​的很有幫助。只是爲了澄清,因爲每個trex結構都有一個指向下一個trex結構體的指針(所以我們有一個二維數組結構),我不知道每個數組索引處每個trex結構鏈的起始長度是多少。你認爲最簡單的方法是列出每個鏈條有多長時間? – user1190650

+0

你不應該知道'trex'的列表有多長。只需知道'struct list'的每個鏈多長時間以便讀回時,您不必確定下一個讀取是下一個「trex」還是下一個「結構列表」。你閱讀每個'struct list',直到你從前一個'trex'到達'fn_len',並且讀取'trex'直到EOF。 –

+0

謝謝!它現在很好用! – user1190650

-1

我不太清楚你在問什麼,但如果我理解正確,你只是想在你在文件中寫完所有內容後才能返回到列表的開頭。

我會做的是股票的列表的第一個結構的地址,以便您可以回到開始任何時候你想要的。 另一種解決方案是創建一個prev/next雙鏈表,以便您可以來回訪問而不會出現任何問題。 將你的第一個鏈接的prev設置爲0,以便你可以知道它是開始。

如果你可以提供更多的細節,我可以更有幫助,但不太清楚你的要求。

+0

問題是關於將整個結構保存到文件並將其讀回來。 –

+0

好的我明白了。那麼最好的解決方案是將其保存爲xml或xml文件。 下載一個lib或製作你自己的。 – Jp1987

+0

哪些庫適用於這種類型的XML輸出?我認爲按照上面的描述寫出每個結構和鏈表將會很好,但是我想知道寫入/來自XML將是一個簡單的解決方案。 – user1190650

0

在保存到文件時,通過trex_arr。每個指針表示單獨鏈接列表的開始。對於每個這樣的列表,你應該分配一些ID(任何數字都可以,但鄰居列表應該有不同的ID)。在保存每個trex結構之前,您將該ID寫入該文件。

在每個結構之後,您將擁有文件名列表(因爲您知道列表中元素的數量,所以您不需要任何ID)。

假設我們有這樣的結構:

trex_arr[0]: trex (3 filenames) -> trex (2 filenames) -> NULL 
trex_arr[1]: trex (2 filenames) -> NULL 
trex_arr[2]: trex (1 filenames) -> NULL 

其結果是,你將不得不在輸出文件如下:

ID0 
trex0 
filename0 
filename1 
filename2 
ID0 
trex1 
filename0 
ID1 
trex2 
filename0 
filename1 
ID2 
trex3 
filename0 

讀回數據是相當簡單的。你應該跟蹤這些ID。一旦它發生變化(例如從ID0ID1),您需要前往下一個輸入trex_arr。另外請記住,當你閱讀文件時,讀取的結構中的指針是無效的,你應該手動修復它們。

或者,您可以在保存期間遍歷每個鏈表直到找到其長度並在保存每個鏈之前存儲trex結構的數目。

+0

非常感謝,現在它工作得很完美 – user1190650