私は、さまざまなもの(構造体の形式)に入力してバイナリファイルに書き込んでいるところです。私は、プログラムが開いている間にファイルを読み書きすることができなければなりません。メソッドの1つは、すべてのクライアントをバイナリファイルに出力する必要があります。私はそのメソッドを呼び出すたびに、ファイルの内容を消去し、それが書き込まれるのを防ぐように見える場合を除いて、動作しているようです。正しい、C++バイナリファイルメソッドがファイルからコンテンツを削除していますか?
fstream binaryFile;
binaryFile.open("HomeBuyer", ios::in | ios::app | ios::binary);
は、同じファイルがプログラムを実行する時間の間使用できるようになっているので、私は、iOS ::アプリでそれを開く必要があります。ここに該当スニペットですか?
ここでエントリを追加する方法です。
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);
感謝を!
書き込みが成功したことを確認します。 'ios :: app'が暗黙的に' ios :: out'が指定されているかどうかはわかりません。 – hmjd
書き込みは成功したようですが、チェックするためにios :: outで試しました。同じことをしているようです。つまり、addClient()メソッド以外のメソッドを呼び出すまで、書き込みは成功したように見えます。 – Nate
EOFが設定されている場合は、 'seekp()'と 'seekg()'の前に 'binaryFile.clear()'を呼び出す必要もあると思います。 – hmjd