在关闭 QFile 之前是否需要刷新 QTextStream?
Is it necessary to flush a QTextStream before closing a QFile?
我需要将一些文本消息记录到具有以下要求的文件中:
-
每条文本消息都写在文件末尾的新行中。
-
合理地确保每条消息都已正确写入文件。
到目前为止,该函数使用的是QTextStream
和QFile
:
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()
从 QIODevice::close() 重新实现。
调用 QFileDevice::flush() 并关闭文件。刷新中的错误将被忽略。
QTextStream的内部缓冲区呢?
在关闭文件之前是否需要调用QTextStream::flush()
?
关于第 2 点,我想在写完之后回读该行将是 100% 确定这一点的唯一方法。(例如,当内核的缓冲区中仍有数据时,可能会发生电源故障)
谢谢。
在您的情况下,它不是,因为您在每次写入中都附加&endl
!
-
写入 QTextStream
&endl
会将""写入流并刷新流。它相当于:stream << 'n' << flush;
-
此外,当QTextStream因
&endl
而被刷新时,它会将所有数据从其写入缓冲区清空到设备中,并在设备上调用flush()
。
虽然这个特定的代码会起作用,因为QTextStream
的操作以endl
结尾,但最好还是确保QTextStream
在关闭文件时完全彻底地完成了对文件的处理。只需使用范围。
bool FileManager::appendLine(const QString &line)
{
if(!m_file.open(QIODevice::Append | QIODevice::Text)) // m_file is a QFile
return false;
bool status {false};
{
QTextStream ts(&m_file);
ts << line << endl;
status = (ts.status() == QTextStream::Ok);
}
m_file.close();
return status;
}
相关文章:
- 是否可以配置提升日志刷新?
- 如何在qt中同步应用程序和显示器的刷新率?
- 在 3ds Max 中更新进度条后,环境和效果 UI 不刷新
- std::endl,在 Python 中是否有等价物?(返回 + 刷新)
- QTextStream,用于打印英语和Unicode 16
- 由于QTextStream的无限循环
- 在 directx11 代码中更改全屏模式下的刷新率不起作用
- QTextStream的操作数到二进制的转换无效
- 如何在 Windows 中立即刷新文件夹图标
- 刷新来自Qpid质子连接的所有消息而不是等待?
- 如何让 cout 缓冲区在 ubuntu 上刷新
- 显示DHT1306温度数据时如何正确刷新Adafruit 11 OLED?
- 为什么PNG图像的stdout有时会在printf中刷新图像的一半
- qfile qtextStream仅读取文件的一部分
- QTextStream 无法使用开放模式写入文件,包括"t" QIODevice::Append
- QML:收到C 信号从C 传递时刷新问题
- 托管语言是否锁定本机库的刷新和重新加载变量?
- 通过qtextstream反复写入并从qbuffer读取
- 记录器何时应刷新
- 在关闭 QFile 之前是否需要刷新 QTextStream?