写入/读入二进制/文本文件

时间:2014-09-14 16:47:30

标签: c++ vector visual-studio-2013 text-files binaryfiles

wFile.open(fileName, ios::out | ios::trunc);
if (!(wFile.is_open()))
{
    cout << "Error in opening the file" << endl;
    return false;
}
else
{
    for (unsigned int i = 0; i < Widgets.size(); i++)
    {
        Widgets.at(i)->copyToBinary(fileName);
    }
    wFile.close();
    return true;
}

我正在尝试从矢量中复制不同的对象类型。我的问题是,当这个代码运行副本时,它只复制最后一个对象。似乎代码只是覆盖现有文本。

另外,我在每个类中都有这个代码(这是copyToBinary函数):

ofstream file(fName);
file << *this;
file << endl;

我在这里缺少什么?

3 个答案:

答案 0 :(得分:0)

您不应该在copyToBinary中重新打开该文件。将wFile作为参数而不是filename

...copyToBinary(ostream &file) {
  file << *this;
  file << endl;
}

并致电...copyToBinary(wFile)

答案 1 :(得分:0)

<强>问题:

您将名称传递给copyToBinary(),重新打开流并覆盖它。

<强>解决方案:

将wFile流作为参考传递并写入,​​而不必每次都重新打开

void copyToBinary(ostream& file) {
   file << *this;
   file << endl;
}

答案 2 :(得分:0)

首先,当您打开文件时

wFile.open(fileName, ios::out | ios::trunc);

每次调用时,现有内容都会因使用trunc模式而丢失。如果您使用ios::app模式会更好。因此,无论何时运行上述代码,它都会以附加模式打开文件。

其次,您正在copyToBinary函数中传递文件名。并使用默认构造函数

ofstream file(fName);

您的文件每次都以默认ios::out模式启用,但不会以ios::app模式启用。你传递打开文件的引用或者在函数中打开文件作为追加模式会更好。