Qt QFile / QTemporaryFile无法读写。

3

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

2
您需要将文件指针移回到文件开头。当文件上没有流时,必须在文件本身上执行此操作,或者在存在流时使用流来执行。另外 - 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. 使用asserts来指示预期为真的条件-这样您就不需要查看输出以验证其是否正确。

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

    QLatin1String是一个常量(只读)包装器,旨在包装C字符串文字-因此无需使line另外成为const,但在实际项目中,您会想要遵循项目的样式指南。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接