0

私は現在、ユーザーが顧客を追加/編集/検索/リストできるときに顧客プログラムを実行しています。このプログラムのバックボーンとして二分木を使用することにしました。私のアイデアは、プログラムが閉じる直前にツリー内の各アイテムを「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);
}
4

1 に答える 1

0

問題は、常にすべてのデータを同じファイルに追加していることです...そのため、前回の実行のすべてが複製されます。

1つの解決策は、現在のアプローチでデータを保存する前にファイルを削除(リンク解除)することです。

ただし、Freezerburnが以前に指摘したように、各アイテムのファイルを開いたり閉じたりしない方が経済的です。上書きモードでファイルを1回開き(つまり、追加しない)、すべてのデータを書き込んでから、ファイルを閉じます。はるかに速いはずです。

もう1つの問題は、データをバイナリ形式で保存することです。読みやすいテキスト形式を定義してみてください。それは問題を明らかにしたでしょう...

于 2013-01-06T22:34:27.447 に答える