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 回答