Qt QFile / QTemporaryFile无法读写

问题描述 投票:1回答:1

我不知道为什么,但我无法得到最简单的QTemporaryFile示例...我的真正意图是在将QAudioInput处理之后将其从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个回答
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字符串和QStrings进行比较。隐式ASCII转换可能是错误的来源而且不鼓励。 QLatin1String是一个常量(只读)包装器,旨在包装C字符串文字 - 因此没有必要另外制作line const,尽管在实际项目中你想要遵循项目的样式指南。
© www.soinside.com 2019 - 2024. All rights reserved.