在关闭 QFile 之前是不是需要刷新 QTextStream?
Posted
技术标签:
【中文标题】在关闭 QFile 之前是不是需要刷新 QTextStream?【英文标题】:Is it necessary to flush a QTextStream before closing a QFile?在关闭 QFile 之前是否需要刷新 QTextStream? 【发布时间】:2018-01-22 21:44:19 【问题描述】:我需要将一些短信记录到具有以下要求的文件中:
每条短信都写在文件末尾的新行中。
合理地确保每条消息都正确写入文件。
到目前为止,该函数正在使用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% 确定这一点的唯一方法。 (例如,当内核缓冲区中仍有数据时,可能会发生电源故障)
谢谢。
【问题讨论】:
对于文本流,flush()
是不必要的,它是用endl
完成的
【参考方案1】:
在您的情况下,它不是,因为您在每次写入时都附加 &endl
!
将&endl
写入QTextStream 会将'\n' 写入流并刷新 流。相当于:stream << '\n' << flush;
此外,当QTextStream由于&endl
而被刷新时,它会将其写入缓冲区中的所有数据清空到设备中并在设备上调用flush()
。
【讨论】:
确实,我在 Qt 的文档中错过了它。谢谢。【参考方案2】:虽然此特定代码会起作用,因为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;
【讨论】:
以上是关于在关闭 QFile 之前是不是需要刷新 QTextStream?的主要内容,如果未能解决你的问题,请参考以下文章