c++ - QFile:同一物理文件的多个句柄不会写入所有数据

标签 c++ qt file qfile

我想知道如何 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.flush()ts << "Hallo\n" 之后这不会发生,这让我认为该语句在 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::basic_ostream 进行的小型测试不是证明:它是否适用于更大的写入?它可以在其他操作系统上运行吗?您是否愿意为了(尚未证实的)速度提升而冒险使用您的工艺?

关于c++ - QFile:同一物理文件的多个句柄不会写入所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35411849/

相关文章:

c++ - 在 msvs 中运行的另一个东西的 g++ 编译错误

c++ - 如何在 qgraphicsview 中进行非平滑/逐步滚动

python - Django/Python 使用进度条下载文件

python - 如何将实例对象保存到硬盘

java - 快速逐字符读取文本文件(java)

c++ - C 和 C++ 中关键字 static 的含义有何不同?

c++ - 通过分发目标文件加速编译

c++ - 更新到 Xcode9 后,我得到 C++ 需要所有声明的类型说明符

c++ - Qt在linux上打印坐标错误

c++ - 如何重定向 qDebug、qWarning、qCritical 等输出?