使用 ofstream 将数据写入其文件后更新 ifstream 对象

Update ifstream object after data is written to its file using ofstream

在测试我的代码时,我遇到了一个问题,当更多数据写入其文件时,ifstream 没有得到更新。所以这是一个演示问题的示例代码:

    ifstream is(filename);
    string line;
    while (getline(is, line))
        cout << "line: " << line << endl;

    ofstream os(filename, ofstream::out | ofstream::app);
    string additional("additional");
    os << additional;
    os.flush();

    while (getline(is, line))
        cout << "line additional: " << line << endl;

没有其他行写入 stdout,尽管它们已写入文件。 我没有使用 fstream 而不是几个 if/ofstream 因为出于测试目的我需要这样。

如何使ifstream"see"文件中的变化?

更新:我使用clear方法清除了位。它在我的 Ubuntu 机器上使用 gcc 工作正常。但它不适用于我的 Mac OSX 和 llvm。你知道独立平台怎么做吗?

我认为原因是您使用 "ofstream::out"

打开了输出流文件
ofstream os(filename, ofstream::out | ofstream::app);

现在,"ofstream::out" 会在打开文件后立即截断文件。也就是说,文件打开后所有以前的内容都将被删除。请尝试改用它:

ofstream os(filename, ios::app);

当您在第一次读取 is 时到达文件末尾时,它会将 eofbit 设置为流的内部错误状态。

您需要先清除它,然后才能继续阅读,方法是调用 is.clear() 函数,重置内部错误状态。

您需要在第一次读取后对输入流调用 std::ios::clear。 当您读取整个文件时,它会在流中设置 failbit 并拒绝继续读取,即使文件实际上在此期间发生了更改。

ifstream is(filename);
string line;
while (getline(is, line))
    cout << "line: " << line << endl;

ofstream os(filename, ofstream::out | ofstream::app);
string additional("additional");
os << additional;
os.flush();

is.clear(); //< Now we can read again
while (getline(is, line))
    cout << "line additional: " << line << endl;