-1

ファイル処理を使用して、バイナリファイルのクラスを介してデータを入力しようとしています。しかし、私ができないことは、ソートされた方法でデータを書き込むことです。その特定のファイルに過去に挿入したレコードの1つを一意に識別する方法がわからないように。なぜ私はそうしようとしているのですか?特定のレコードの削除、変更などの操作を実行できるようにしたいからです。静的変数を使用してみましたが、次にプログラムを実行するまでその値を保持したいと思います。これは静的変数では不可能です。ところで、これはクラスです。

class question
{
    private:
    char question[500];
    char option1[25],option2[25],option3[25],option4[25];
    int answernumber;
    public:
    int qno;
    void createquestion(); // Just to to accept data into
                           // question,options,answernumebr.
}

ここでの唯一の問題は、質問番号であるqnoを割り当てることです。主キーとして使用する予定です(この単語の使用は間違っています)。しかし、ユーザーの介入なしに対応する値を自動的に割り当てる方法がわかりませんか?助言がありますか?編集:-私もこれをやろうとしました--->最後に入力したレコードを読んでから、対応する質問番号を抽出することを考えました。そして、その番号を割り当てて、それに1を追加します... so old_qno + 1 = new_qno .....しかし、残念ながらあまりうまくいきませんでした。私のすべての質問は質問1としてのみ割り当てられていたので

4

1 に答える 1

0

これまでに作成した質問の数を数える方法として、作成したファイルのサイズを使用できます。

ifstream file("filename");
file.seekg(0, ios_base::end);
streampos file_size = file.tellg();
file.close();
int next_question = file_size/sizeof(question) + 1;

ただし、削除には注意する必要があります。ファイルに質問1、2、3、4があり、質問3を削除するとします。これで、ファイルに1、2、4が含まれるため、上記の方法では次の質問は次のようになります。 4、しかしあなたはすでに質問4を持っています。これに対処する1つの方法は論理的な削除をすることです。ファイルから質問を実際に削除する代わりに、そこに残しておきますが、削除されたことがわかるように何らかの方法でマークを付けます。たとえば、質問番号をゼロに設定できます。したがって、質問3を削除した後、上記の例に戻ると、1、2、0、4になります。これで、ファイルサイズメソッドは次の質問が5であると正しく表示します。

于 2012-08-05T09:13:21.187 に答える