Qt QFile / QTemporaryFile 无法读取或写入
Qt QFile / QTemporaryFile cannot read or write
我不知道为什么,但我无法得到最简单的 QTemporaryFile 示例 运行...我的真正意图是在稍后处理之前将 QAudioInput 中的数据写入临时文件。
尝试了几次后,我意识到 .read()、.readLine()、.readAll() 或 .write() 都没有任何效果...错误字符串始终是 "Unknown Error" 并且它既不适用于 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++ class。无需手动关闭文件。 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风格代码的技术:
包含整个 Qt 模块。请记住,模块包括它们的依赖项,即 #include <QtWidgets>
本身就足够了。
在不必要的地方缺少 main()
个参数。
缺少 QCoreApplication
不必要的实例。如果您需要应用程序实例但没有实例,您将收到明确的运行时错误。
使用断言来指示预期为真的条件 - 这样您就不需要查看输出来验证它是否正确。
在 QStringLiteral
上使用 QLatin1String
,其中 ASCII 字符串需要与 C 字符串和 QString
进行比较。隐式 ASCII 转换可能是错误的来源,因此不鼓励。
QLatin1String
是常量 (read-only) 包装器,旨在包装 C 字符串文字 - 因此无需另外制作 line
const
,尽管实际上您希望在此处遵循项目风格指南的项目。
我不知道为什么,但我无法得到最简单的 QTemporaryFile 示例 运行...我的真正意图是在稍后处理之前将 QAudioInput 中的数据写入临时文件。
尝试了几次后,我意识到 .read()、.readLine()、.readAll() 或 .write() 都没有任何效果...错误字符串始终是 "Unknown Error" 并且它既不适用于 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++ class。无需手动关闭文件。 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风格代码的技术:
包含整个 Qt 模块。请记住,模块包括它们的依赖项,即
#include <QtWidgets>
本身就足够了。在不必要的地方缺少
main()
个参数。缺少
QCoreApplication
不必要的实例。如果您需要应用程序实例但没有实例,您将收到明确的运行时错误。使用断言来指示预期为真的条件 - 这样您就不需要查看输出来验证它是否正确。
在
QStringLiteral
上使用QLatin1String
,其中 ASCII 字符串需要与 C 字符串和QString
进行比较。隐式 ASCII 转换可能是错误的来源,因此不鼓励。QLatin1String
是常量 (read-only) 包装器,旨在包装 C 字符串文字 - 因此无需另外制作line
const
,尽管实际上您希望在此处遵循项目风格指南的项目。