Qt QFile / QTemporaryFile无法读写

时间:2018-03-05 15:23:11

标签: qt qfile

我不知道为什么,但是我无法运行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"
""
""

提前谢谢!

1 个答案:

答案 0 :(得分:0)

您需要将文件指针移回文件的开头。当文件没有流时,或者当存在流时,必须在文件本身上完成此操作。另外 - 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 <QtWidgets>本身就足够了。

  2. 在没有必要的情况下缺少main()个参数。

  3. 在没有必要的情况下缺少QCoreApplication个实例。如果您需要应用程序实例,但是没有应用程序实例,您将获得明确的运行时错误。

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

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

    QLatin1String是一个常量(只读)包装器,用于包装C字符串文字 - 因此不需要line另外const,尽管在实际中您希望在此处遵循项目风格指南的项目。