c++ - 是否有必要在关闭 QFile 之前刷新 QTextStream?

标签 c++ linux qt

我需要将一些文本消息记录到具有以下要求的文件中:

  1. 每条短信都在文件末尾的新行中写入。

  2. 合理确定每条消息都已正确写入文件。

到目前为止,该函数正在使用QTextStreamQFile:

bool FileManager::appendLine(const QString &line)
{
    if(!m_file.open(QIODevice::Append | QIODevice::Text)) // m_file is a QFile
        return false;

    QTextStream ts(&m_file);

    ts << line << endl;

    bool status = (ts.status() == QTextStream::Ok);

    m_file.close();

    return status;
}

第 1 点满意,但我对第 2 点有疑问。

甚至 Qt Doc 也说 close() QFile 来刷新它所有的内部缓冲区就足够了:

void QFileDevice::close()

Reimplemented from QIODevice::close().

Calls QFileDevice::flush() and closes the file. Errors from flush are ignored.

QTextStream 的内部缓冲区呢?

是否有必要在关闭文件之前调用QTextStream::flush()

关于第 2 点,我想在写完后立即回读该行是 100% 确定这一点的唯一方法。 (例如,当内核在其缓冲区中仍有数据时可能会发生电源故障)

谢谢。

最佳答案

在您的情况下,不是,因为您要附加 &endl在每一篇文章中!

  • 写作 &endl到 QTextStream 将 '\n' 写入流并刷新 流。它等效于:stream << '\n' << flush;

  • 此外,当 QTextStream 由于 &endl 而被刷新时, 它会将所有数据从其写入缓冲区清空到设备中并调用 flush()在设备上。

关于c++ - 是否有必要在关闭 QFile 之前刷新 QTextStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48390738/

相关文章:

ruby-on-rails - 用 yum 安装的 mod_passenger.so 在哪里?

c++ - 如何以编程方式在 QMainWindow 中添加 QGraphicsView?

qt - 我有一个大项目,依赖于 GNU automake,想添加 QT 组件,我现在必须对所有内容都使用 qmake 吗?

c++ - 指向指针内存分配的指针,为什么会出错?

c# - C++/JavaScript Unity3D 与 Java

php - 文件夹权限 777 不工作

qt - 在诺基亚 Qt SDK 上测试启动器图标

c# - 使用结构 union 将 C++ 编码到 C# 结构

c++ - 重载运算符<<用于查找二维数组的总和

linux - 防止 Gearman 耗尽系统内存