Qt QFile/QTemporaryFile无法读写

标签 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"
""
""

提前致谢!

最佳答案

您需要将文件指针移回文件开头。当文件上没有流时,必须在文件本身上完成,或者在存在流时使用流。还有 - 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. 使用QLatin1StringQStringLiteral其中 ASCII 字符串需要与 C 字符串和 QString 进行比较秒。隐式 ASCII 转换可能是错误的来源,因此不鼓励。

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

关于Qt QFile/QTemporaryFile无法读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49113757/

相关文章:

c++ - 对于一些微积分密集型代码,我怎样才能获得最快的迭代?

c++ - 第一次部署 Qt 应用程序,动态链接?

qt - 如何在 Windows 上从 Git 存储库构建最新的 Qt?

c++ - QFile 不会打开文件

c++ - 即使文件存在,如何修复 QFile 打开错误(未知错误)?

c++ - 标签上的绑定(bind)循环警告

c++ - Qt 创建文件夹之间的链接

qt - QThreadPool 中的 QVector::clear 和 QFile::close

c++ - QFile::copy 是否保留复制文件中的源文件权限?

c++ - 在另一个类中更改小部件类型的行为