私は現在、ユーザーが顧客を追加/編集/検索/リストできるときに顧客プログラムを実行しています。このプログラムのバックボーンとして二分木を使用することにしました。私のアイデアは、プログラムが閉じる直前にツリー内の各アイテムを「customers.dat」に保存し、起動時にファイルからツリーにすべてをロードすることでした。これまでのところ良好ですが、最終的に二分探索木をファイルに保存することに成功した後、1つのバグがあります。
初めて3人の顧客を追加するとします。次に、プログラムを閉じて、再度開くと、ツリーに同じ3人の顧客が見つかります。ただし、次にファイルを開くと、事前定義されたエラーの1つからエラーが発生します。これは、ノードが空であるか比較できないために、ノードが左に移動するか右に移動するかを識別できない場合に発生します。ここにいくつかのコードスニペットがあります。また、a + b以外の他のファイルオープン手法を使用してみましたが、そのようなエラーは発生しませんでしたが、プログラムの設計方法として、appendメソッドが必要です。そうしないと、1つのレコードしか保存されません。
顧客はヘッダーのCstmrに保存されます。
typedef struct customer
{
char Name[MAXNAME];
char Surname[MAXNAME];
char ID[MAXID];
char Address[MAXADDRESS];
} Cstmr;
そうしないと:
void CustomerTreeToFile(Tree*pt)
{
if (TreeIsEmpty(pt))
puts("Nothing to save!");
else
Traverse(pt,saveItem); //Traverses each node, and appliess the function
//saveItem to each node
}
void saveItem(Cstmr C)
{
save = C;
customers = fopen("customers.dat","ab+");
fwrite(&C,sizeof (Cstmr), 1, customers);
fclose(customers);
}