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

Posted

技术标签:

【中文标题】在关闭 QFile 之前是不是需要刷新 QTextStream?【英文标题】:Is it necessary to flush a QTextStream before closing a QFile?在关闭 QFile 之前是否需要刷新 QTextStream? 【发布时间】:2018-01-22 21:44:19 【问题描述】:

我需要将一些短信记录到具有以下要求的文件中:

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

    合理地确保每条消息都正确写入文件。

到目前为止,该函数正在使用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% 确定这一点的唯一方法。 (例如,当内核缓冲区中仍有数据时,可能会发生电源故障)

谢谢。

【问题讨论】:

对于文本流,flush() 是不必要的,它是用endl 完成的 【参考方案1】:

在您的情况下,它不是,因为您在每次写入时都附加 &amp;endl

&amp;endl 写入QTextStream 会将'\n' 写入流并刷新 流。相当于:stream &lt;&lt; '\n' &lt;&lt; flush;

此外,当QTextStream由于&amp;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?的主要内容,如果未能解决你的问题,请参考以下文章

CAD命令qtext怎么用?

QFile.open() 在上下文管理方面是不是像 Python 的 open() 一样?

单页应用/vue等页面未保存刷新关闭返回等确认提示

在添加新规则之前,iptables 是不是需要刷新?

Qt:如何打印 QFile?

QFile::copy 是不是将源文件权限保留在复制的文件中?