我有一个任务,我在各种事物上写入输入(以结构的形式),然后写入二进制文件。在程序打开时,我必须能够读取和写入文件。其中一种方法需要打印出二进制文件中的所有客户端。它似乎正在工作,除非每当我调用该方法时,它似乎都会擦除文件的内容并阻止将更多内容写入其中。以下是适用的片段:
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);
谢谢!