【问题标题】:Qt QFile / QTemporaryFile cannot read or writeQt QFile / QTemporaryFile 无法读取或写入
【发布时间】:2018-08-13 07:16:09
【问题描述】:

我不知道为什么,但我无法运行 QTemporaryFile 的最简单示例...我的真正意图是在稍后处理之前将来自 QAudioInput 的数据写入临时文件。

在尝试了几次之后,我意识到 .read()、.readLine()、.readAll() 或 .write() 都不会有任何效果...错误字符串始终是“未知错误”,而且都不起作用对于 QFile 或 QTemporaryFile。

#include <QCoreApplication>
#include <QTemporaryFile>
#include <QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTemporaryFile tf;
    tf.open();
    tf.write("Test");
    QTextStream in(&tf);
    qDebug() << "Testprogramm";
    qDebug() << tf.isOpen();
    qDebug() << tf.errorString();
    qDebug() << in.readLine();
    qDebug() << tf.readAll();
    tf.close();
    return a.exec();
} 

调试帖子:

Testprogramm
true
"Unknown error"
""
""

提前感谢您!

【问题讨论】:

    标签: qt qfile


    【解决方案1】:

    您需要将文件指针移回文件的开头。当文件上没有流时,必须在文件本身上完成此操作,或者在存在流时使用流。此外 - QFile 是一个适当的 C++ 类,用于管理文件资源。无需手动关闭文件。 QFile::~QFile 完成了这项工作。

    以下工作正常:

    #include <QtCore>
    
    int main() {
        auto line = QLatin1String("Test");
        QTemporaryFile tf;
        tf.open();
        Q_ASSERT(tf.isOpen());
        tf.write(line.data());
        tf.reset(); // or tf.seek(0)
        QTextStream in(&tf);
        Q_ASSERT(in.readLine() == line);
        in.seek(0); // not in.reset() nor tf.reset()!
        Q_ASSERT(in.readLine() == line);
    }
    

    上面还演示了适用于sscce风格代码的以下技术:

    1. 包含整个 Qt 模块。请记住,模块包含它们的依赖项,即 #include &lt;QtWidgets&gt; 本身就足够了。

    2. 在不必要的地方没有main() 参数。

    3. 没有必要的QCoreApplication 实例。如果您需要应用程序实例但没有,您将得到明确的运行时错误。

    4. 使用断言来指示预期为真的条件 - 这样您就不需要查看输出来验证它是否正确。

    5. QStringLiteral 上使用QLatin1String,其中ASCII 字符串需要与C 字符串和QStrings 进行比较。隐式 ASCII 转换可能是错误的来源,因此不鼓励使用。

      QLatin1String 是一个常量(只读)包装器,旨在包装 C 字符串文字 - 因此无需另外创建 line const,尽管在实际项目中您希望遵循项目的风格在这里指导。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多