1

さまざまなもの(構造体の形式で)に入力を書き込んでから、バイナリファイルに書き込むという割り当てがあります。プログラムが開いている間、ファイルの読み取りと書き込みの両方ができる必要があります。方法の1つは、バイナリファイル内のすべてのクライアントを出力する必要があります。そのメソッドを呼び出すたびに、ファイルの内容が消去され、それ以上書き込まれないように見えることを除いて、機能しているようです。該当するスニペットは次のとおりです。

fstream binaryFile;
binaryFile.open("HomeBuyer", ios::in | ios::app | ios::binary);

プログラムを実行するたびに同じファイルが使用できるはずなので、ios :: appで開く必要がありますか?

エントリを追加する方法は次のとおりです。

void addClient(fstream &binaryFile) {
      HomeBuyer newClient; //Struct the data is stored in
      // -- Snip -- Just some input statements to get the client details //

      binaryFile.seekp(0L, ios::end); //This should sent the write position to the
                                     //end of the file, correct?
      binaryFile.write(reinterpret_cast<char *>(&newClient), sizeof(newClient));

      cout << "The records have been saved." << endl << endl;
}

そして今、すべてのエントリを印刷するメソッド:

void displayAllClients(fstream &binaryFile) {
    HomeBuyer printAll;
    binaryFile.seekg(0L, ios::beg);
    binaryFile.read(reinterpret_cast<char *>(&printAll),sizeof(printAll));

    while(!binaryFile.eof()) {  //Print all the entries while not at end of file
        if(!printAll.deleted)  {
             // -- Snip -- Just some code to output, this works fine //
        }

        //Read the next entry
        binaryFile.read(reinterpret_cast<char *>(&printAll),sizeof(printAll)); 
    }
    cout << "That's all of them!" << endl << endl;
}

プログラムをステップスルーすると、必要な数のクライアントを入力でき、displayAllClients()を初めて呼び出したときにすべてのクライアントが出力されます。しかし、displayAllClients()を一度呼び出すとすぐに、バイナリファイルがクリアされたように見え、それ以上クライアントを表示しようとしても結果が得られません。

seekpとseekgを間違って使用していますか?

私が理解していることから、これは私の書き込み位置をファイルの終わりに設定するはずです:

binaryFile.seekp(0L, ios::end);

そして、これは私の読み取り位置を最初に設定する必要があります:

binaryFile.seekg(0L, ios::beg);

ありがとう!

4

2 に答える 2

3

これで問題が解決したので、コメントを貼り付けてください。

が設定されている場合は、binaryFile.clear()seekp()に電話する必要があります。そうしないと、機能しません。seekg()EOF

于 2012-04-27T21:49:04.260 に答える
1

これはios::appのドキュメントです

ios::app

    All output operations are performed at the end of the file, appending the
    content to the current content of the file. This flag can only be used in 
    streams open for output-only operations.

これは宿題なので、あなた自身の結論を導き出させてあげましょう。

于 2012-04-27T21:45:35.543 に答える