Qt 中将文件类型分为2大类
文本文件
- 文件内容是可读的文本字符
数据文件
- 文件内容是直接的二进制数据
QFile 直接支持文本文件和数据文件的读写
qint64 read(char* data,qint64 maxSize)
QByteArray read(qint64 maxSize)
qint64 write(const char* data,qint64 maxSize)
qint64 write(const QByteArray& byteArray)
思考
如何将一个浮点数据写入文本文件和数据文件?
直接使用 QFile 读写
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("C:/Users/Administrator/Desktop/test.txt");
if(file.open(QIODevice::WriteOnly))
{
QString s("liujie");
double d(3.14);
file.write(s.toStdString().c_str());
file.write(reinterpret_cast<char *>(&d), sizeof(d));
file.close();
}
if(file.open(QIODevice::ReadOnly))
{
QString s = "";
double d = 0;
s = file.read(6);
file.read(reinterpret_cast<char *>(&d), sizeof(d));
file.close();
qDebug() << s;
qDebug() << d;
}
return a.exec();
}
运行结果如下所示
Qt 提供辅助类简化了文本文件/数据文件的读写
QTextStream
- 写入的数据全部转化为可读文本
QDataStream
- 写入的数据根据类型转化为二进制数据
IO设备辅助类的使用方法
QTextStream 使用示例
void text_stream_test(QString f)
{
QFile file(f);
if(file.open(QIODevice::WriteOnly | QIODevice::Text))
{
QTextStream out(&file);
out << "liujie" << endl;
out << "Result: " << endl;
out << 8 << '*' << 5 << "=" << 8 * 5 << endl;
file.close();
}
if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QTextStream in(&file);
while(!in.atEnd())
{
QString s = in.readLine();
qDebug() << s;
}
file.close();
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
text_stream_test("C:/Users/Administrator/Desktop/test.txt");
return a.exec();
}
运行结果如下图所示
QDataStream 使用示例
void data_stream_test(QString f)
{
QFile file(f);
if(file.open(QIODevice::WriteOnly))
{
QDataStream out(&file);
out.setVersion(QDataStream::Qt_5_12);
out << QString("liujie");
out << QString("Result: ");
out << 3.14;
file.close();
}
if(file.open(QIODevice::ReadOnly))
{
QDataStream in(&file);
QString s = "";
QString result = "";
double exp = 0;
in.setVersion(QDataStream::Qt_5_12);
in >> s;
in >> result;
in >> exp;
file.close();
qDebug() << s;
qDebug() << result;
qDebug() << exp;
}
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
data_stream_test("C:/Users/Administrator/Desktop/test.txt");
return a.exec();
}
运行结果如下图所示
不同 Qt 版本的数据流文本格式可能不同
void setVersion(int v) // 设置读写版本号
int version() const // 获取读写版本号
当数据流文件可能在不同版本的 Qt 程序间传递数据时,需要考虑版本问题!