使用 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;
在测试我的代码时,我遇到了一个问题,当更多数据写入其文件时,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;