さまざまなもの(構造体の形式で)に入力を書き込んでから、バイナリファイルに書き込むという割り当てがあります。プログラムが開いている間、ファイルの読み取りと書き込みの両方ができる必要があります。方法の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);
ありがとう!