【发布时间】:2016-02-15 14:24:15
【问题描述】:
我想知道QFile 在打开同一个文件的多个句柄时的行为(在 Windows 7 上使用 Visual Studio 2013 中的 C++),所以我编写了以下小程序:
QFile file("tmp.txt");
file.open(QIODevice::WriteOnly | QIODevice::Truncate);
QTextStream ts(&file);
ts << "Hallo\n";
QFile file2("tmp.txt");
file2.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream ts2(&file2);
ts2 << "Hallo 2\n";
file.close();
ts2 << "Hello again\n";
file2.close();.
这会在文件 tmp.txt 中产生以下输出:
Hallo 2
Hello again
所以第一个Hallo 语句丢失了。如果我在ts << "Hallo\n" 之后立即执行ts.flush(),则不会发生这种情况,这使我认为该语句在QString 的内部缓冲区中丢失了,或者它被后续的输出语句覆盖了。但是,我想在日志框架中使用QFile,所以我不想总是刷新,因为这会降低性能。
我也用std::basic_ostream<char>而不是QFile尝试了同样的事情:
std::basic_ofstream<char> file;
file.open("tmp.txt", std::ios_base::out | std::ios_base::ate | std::ios_base::app);
file << "Hallo\n";
std::basic_ofstream<char> file2;
file2.open("tmp.txt", std::ios_base::out | std::ios_base::ate | std::ios_base::app);
file2 << "Hallo 2\n";
file.close();
file2 << "Hello again\n";
file2.close();
按照我的预期输出:
Hallo
Hallo 2
Hello again
那么QFile 的例子有什么问题呢? QFile 是否不打算与指向同一个文件的多个句柄一起使用,或者这里到底发生了什么?我认为我的用例很常见,所以发现这种行为让我有点惊讶。我在 Qt documentation 中找不到更多细节。我读过here Qt 以共享模式打开文件,所以这应该不是问题。
我最终想使用QFile 进行日志记录(其中对执行实际写入的函数的访问当然是同步的),但是这个小例子让我担心一些日志语句可能会在途中丢失。你认为使用 STL 流而不是 QFile 会更好吗?
编辑
正如所指出的,std::endl 会导致刷新,所以我将上面的 STL 示例更改为仅使用 \n,根据here 不会导致刷新。不过,上述行为没有改变。
【问题讨论】:
-
std::endl;也用过冲洗
-
刚刚在没有
std::endl的情况下对其进行了测试 - 相同的行为(已编辑)