Qt学习之路22--文本流和数据流

版权声明:未经说明,禁止转载 https://blog.csdn.net/tqs_1220/article/details/82228906

Qt中的文件分为两类

  • 文本文件:文件内容是直接可读的字符
  • 数据文件:文件内容是二进制数据

在上一节中的QFile直接支持文本文件和数据文件的读写,具体见https://blog.csdn.net/tqs_1220/article/details/82193502

如何将一个浮点数写入文本文件或数据文件?

按照之前的方式可以直接通过QFile类将浮点数写入到文件。

QFile file("C:/Users/song8023/Desktop/test.hex");

if(file.open(QIODevice::WriteOnly))
{
    QString str = "TQSong";
    double value = 3.14;//将要写入一个浮点数

    file.write(str.toStdString().c_str());//将str先转成标准的字符串类型,然后再转成字节数据类型
    file.write(reinterpret_cast<char*>(&value), sizeof(value));

    file.close();

}

if(file.open(QIODevice::ReadOnly))
{
    QString str;
    double value;//保存读取的数据

    str = QString(file.read(6));//读取前6个字符,此时文件指针会发生偏移
    file.read(reinterpret_cast<char*>(&value), sizeof(value));
    qDebug() << str;
    qDebug() << value;

    file.close();
}

这里写图片描述
这种操作固然可以成功,但麻烦的是需要计算写入的数据的长度和读取数据时候的文件指针位置,一旦计算出错得到的结果就会和预期不一致;另一点麻烦在于写入之前需要进行一个转换步骤,转换成QFile支持写入的类型,在读取时也需要转换操作。仅凭这两点使得这种方法是不愉快的。

文本流和数据流

所以,Qt为了使得操作简便,提供了辅助类使得我们在文本文件和数据文件的操作上变得简单。
- QTextStream:写入的数据全部转换为可读的文本
- QDataStream:写入的数据根据类型转换成对应的二进制数据

文本流

QFile file("C:/Users/song8023/Desktop/test.txt");
QTextStream in(&file);

if(file.open(QIODevice::WriteOnly | QIODevice::Text))
{
    in << "TQSong" << endl;//按流的方式写入
    in << 3 << '+' << 2 << '-' << 5 << '='  << 3+2-5 << endl;
    file.close();
}

if(file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    QTextStream out(&file);

    while(!out.atEnd())//判断到没到文件末尾
    {
        qDebug() << out.readLine();//按行读取
    }
    file.close();
}

这里写图片描述

数据流

QFile file("C:/Users/song8023/Desktop/data.hex");
QDataStream in(&file);
if(file.open(QIODevice::WriteOnly))
{
    in << QString("TQSong");
    in << QString("Hello World");
    in << 3.14;
    file.close();
}

if(file.open(QIODevice::ReadOnly))
{
    QDataStream out(&file);
    QString str1 = "";
    QString str2 = "";
    double value = 0;

    out >> str1;//将数据流输出到指定位置
    out >> str2;
    out >> value;
    file.close();

    qDebug() << str1;
    qDebug() << str2;
    qDebug() << value;

}

这里写图片描述

注意:不同的Qt版本的数据流文件格式可能不同,所以当数据流文件在不同版本间传递时需要考虑版本的问题

  • void setVersion(int v)//设置版本号

    • 在Qt4.7中给出下列版本型号

      QDataStream::Qt_1_0 1   Version 1 (Qt 1.x)
      QDataStream::Qt_2_0 2   Version 2 (Qt 2.0)
      QDataStream::Qt_2_1 3   Version 3 (Qt 2.1, 2.2, 2.3)
      QDataStream::Qt_3_0 4   Version 4 (Qt 3.0)
      QDataStream::Qt_3_1 5   Version 5 (Qt 3.1, 3.2)
      QDataStream::Qt_3_3 6   Version 6 (Qt 3.3)
      QDataStream::Qt_4_0 7   Version 7 (Qt 4.0, Qt 4.1)
      QDataStream::Qt_4_1 Qt_4_0  Version 7 (Qt 4.0, Qt 4.1)
      QDataStream::Qt_4_2 8   Version 8 (Qt 4.2)
      QDataStream::Qt_4_3 9   Version 9 (Qt 4.3)
      QDataStream::Qt_4_4 10  Version 10 (Qt 4.4)
      QDataStream::Qt_4_5 11  Version 11 (Qt 4.5)
      QDataStream::Qt_4_6 12  Version 12 (Qt 4.6)
      QDataStream::Qt_4_7 Qt_4_6 Qt_4_8 = Qt_4_7  Same as Qt_4_6.
      
  • int version()const//获取版本号

小结

  • Qt中的文件辅助类用于数据的操作简便
  • QTextStream用于文本数据的快速读写
  • QDataStream用于二进制数据的快速读写
  • QDataStream的格式与Qt的版本有关
  • 数据格式文件在版本间传递时需要考虑版本问题

猜你喜欢

转载自blog.csdn.net/tqs_1220/article/details/82228906