我有以下代码:
ofstream mOutFile.open(logPath, ios_base::app);
string lBuilder;
lBuilder.append("========================================================\n");
lBuilder.append("Date: ");
lBuilder.append(asctime(timeinfo));
lBuilder.append("\n");
lBuilder.append("Log Message:\n");
lBuilder.append(toLog);
lBuilder.append("\n");
lBuilder.append("========================================================\n\n");
int lSize = lBuilder.size();
char* lBuffer = new char[lSize];
int index = 0;
for each (char c in lBuilder)
lBuffer[index++] = c;
mOutFile.write(lBuffer, lSize);
mOutFile.flush();
不幸的是,在关闭应用程序之前(我假设关闭ofstream也可以),输出不会写入文本文件。我知道我可能关闭并重新打开流,一切都“正常”,但这似乎是一个愚蠢和不正确的解决方案。我在这里做错了什么?
我还根据我在这里找到的其他问题尝试了以下变体,但这些解决方案不起作用:
mOutputFile << flush;
mOutputFile << endl;
提前感谢您提供任何帮助。
编辑此代码中的所有内容都在使用visual c ++,它的构建和工作正常,除非在流关闭之前不写入文件,即使我强制刷新。另外,我从使用&lt;&lt;&lt;运算符char *和.write()以查看是否有任何不同的行为。
答案 0 :(得分:8)
std::ofstream file(logPath, ios_base::app);
file << "========================================================\n"
<< "Date: " << asctime(timeinfo)
<< "\nLog Message:\n" << toLog
<< "\n========================================================\n\n"
<< std::flush;
//if you want to force it write to the file it will also flush when the the file object is destroyed
//file will close itself
这不仅更容易阅读,但它可能也比你的方法更快+它是一个更标准的appraoch
答案 1 :(得分:1)
我最终只是通过在写入操作后关闭并重新打开流来“使其工作”。
mOutputFile << "all of my text" << endl;
mOutputFile.close();
mOutputFile.open(mLogPath);
编辑尝试在其他几个系统上强制刷新后,看起来在我的开发计算机上运行正常。不是好消息,但至少上述解决方案似乎在以编程方式刷新ofstream失败时起作用。我不确定上述代码的含义,所以如果有人想要关闭,如果有关闭和重新打开这样的流的影响。