在关闭 QFile 之前是否需要刷新 QTextStream?

Is it necessary to flush a QTextStream before closing a QFile?

本文关键字:刷新 QTextStream 是否 QFile      更新时间:2023-10-16

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

  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()

从 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;
}