C ++二进制文件方法是从文件中删除内容?

时间:2012-04-27 21:25:36

标签: c++ binaryfiles

我有一个作业,我在各种事物(以结构形式)编写输入,然后写入二进制文件。程序打开时,我必须能够读取和写入文件。其中一种方法需要打印出二进制文件中的所有客户端。它似乎工作,除非我调用该方法,它似乎擦除文件的内容,并防止更多的写入它。以下是适用的代码段:

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()一次,它似乎就会清除二进制文件,而且显示客户端的任何进一步尝试都没有给我带来任何结果。

我是否错误地使用了搜索和搜索?

根据我的理解,这应该将我的写位置设置到文件的末尾:

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

这应该将我的阅读位置设置为开头:

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

谢谢!

2 个答案:

答案 0 :(得分:3)

粘贴评论,因为这解决了问题。

如果设置了binaryFile.clear(),您需要在seekp()seekg()之前致电EOF,否则他们将无法工作。

答案 1 :(得分: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.

由于这是作业,我会让你得出自己的结论。