2012-09-18 52 views
2

我在看類似的問題,但沒有找到解決方案。 我有一個類似於超過2個節點的樹的結構。 我也有一個指向根的指針。如何在C中將樹數據寫入文件?

typedef struct tree 
{ 
    char *name; 
    struct tree *children 
}TREE; 

我想寫這個數據到一個文件,只是糊塗了所以很想得到一些幫助

我想用:

int writeData(TREE *root , char *filename){ 

    FILE *f = NULL; 
    int numWritten = 0; 

fopen_s(&f , filename, "w+"); 
fwrite(root , sizeof(TREE) , ??? , f); 

}

我不不知道該寫什麼,如果我有孩子到每一個元素,所以我就會把它們扔到一起 - 我怎麼能這樣做呢?

+0

只有利用資本名字#define和對上帝的愛沒有的typedef的結構。 – 2012-09-19 20:20:31

回答

4

嗯,這個問題被稱爲「序列化結構化數據」 - 基本上是解析的相反。的事情是,你不能只是轉儲在內存中的數據結構的原始二進制數據到一個文件 - 當地址變更就沒有意義在下次啓動你的程序。你必須想出一個能夠描述你的數據結構並將其寫入文件的格式。然後,當然,如果您想稍後從文件中恢復數據結構,您還必須爲該格式編寫解析器。

我建議使用JSON - 它是一個輕量級,易寫,易閱讀的數據格式,並且它也是通用的 - 這是理想的存儲簡單的抽象數據類型。 Here's my library,可以產生和基本數據類型解析JSON(如數組,關聯數組,字符串,數字...)

怎能如果我有孩子的每一個元素,所以我木珠去把他們所有

對於這個問題:你可能尋找recursion.你需要爲你走過的每一個節點/葉遞歸遍歷數據樹併產生代表你的數據結構中的數據(假設你的數據結構是相似一個圖形/樹)。

+0

謝謝!我基本上是爲xml解析器做的 - 所以當我保存我的數據 - 我應該使它與xml格式類似?像使用fprintf(」 < %s >,exmaple.name)? – user1386966

+0

@ user1386966是的,沒錯! – 2012-09-18 15:44:23

+0

爲什麼會我需要序列化?(抱歉..沒有完全得到它)。如果我可以遍歷使用DFS樹(一那去越陷越深),只是在beginging相關象星座加:「>」和「=」爲屬性..系列化如何才能更好 – user1386966

0

您可以複製工作數據結構,使所有使用樹存儲在樹的數組和更改所有樹的指針是指數進入陣列,然後樹的整個陣列存儲在一個二進制文件。 哦,char指針必須是指向存儲的單個字符數組的指針。

還不如可讀性YAML或JSON,但如果你需要一個二進制格式...