2

同様の質問を見ていましたが、解決策が見つかりませんでした。2 つ以上のノードを持つツリーに似た構造をしています。ルートへのポインタもあります。

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);

}

何を書けばいいのかわかりません。すべての要素に子がある場合、すべてを投げに行く必要があります - どうすればそれを行うことができますか?

4

2 に答える 2

5

この問題は、「構造化データのシリアル化」として知られています。基本的には、解析とは逆です。問題は、メモリ内データ構造の生のバイナリ データをファイルにダンプすることはできないということです。アドレスが変更されたときにプログラムを次に起動したときに意味がありません。データ構造を記述してファイルに書き込むことができるフォーマットを考え出す必要があります。もちろん、後でファイルからデータ構造を復元したい場合は、そのフォーマット用のパーサーも作成する必要があります。

JSON を使用することをお勧めします。JSON は、軽量で書きやすく読みやすいデータ形式であり、汎用でもあります。単純な抽象データ型を格納するのに理想的です。これは、基本的なデータ型 (配列、連想配列、文字列、数値など) から JSON を生成および解析できるライブラリです。

どうすればすべての要素に子がいるとしたら、すべてを投げに行く必要があります

この質問について: おそらく再帰を探しているでしょう。データ ツリーを再帰的にトラバースし、各ノード/リーフを歩くときにデータ構造を表すデータを生成する必要があります (データ構造がグラフ/ツリーに似ていると仮定します)。

于 2012-09-18T15:28:30.643 に答える
0

使用されるすべての TREE が TREE の配列に格納されるように作業データ構造をコピーし、すべての TREE ポインターを配列のインデックスに変更してから、TREE の配列全体をバイナリ ファイルに格納することができます。ああ、char ポインターは、格納されている単一の文字配列へのポインターである必要があります。

YAML や JSON ほど読みやすくはありませんが、バイナリ形式が必要な場合は ...

于 2012-09-19T20:18:57.617 に答える