Qt 33 文件流和数据流,QTextStream,QDataStream

本文介绍了Qt中QFile、QTextStream和QDataStream的使用方法。QFile主要处理字节数据,需要类型转换;QTextStream用于将数据转换为可读文本进行读写;QDataStream则将数据转换为二进制格式。通过示例代码展示了如何使用这些类进行文件的读写操作,包括字符串和浮点数的写入与读取。

学习自唐佐林老师的Qt


总结:

1 使用QFile类的write(),read()直接将字节类数据写入文本文件和数据文件需要类型转换。

2 QTextStream 使用:辅助类对象 ,写入辅助类对象的数据全部转换为可读文本,并用IO设备对象地址对其初始化,以指定类型读出数据

3 QDataStream 使用:辅助类对象 ,写入辅助类对象的数据全部转换为二进制数据,并用IO设备对象地址对其初始化,以指定类型读出数据


在这里插入图片描述

在这里插入图片描述在这里插入图片描述

write()
read()
所操作的是对象必须是直接的字节类数据,如果直接用QFile的 write(),read()操作 非字节类数据,则需要类型转换,比较麻烦。

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("D:/work/QT_TEST/qt/code/33-2/test.hex");

    //并没有注明以文本方式打开文件,则默认为以二进制方式打开文件
    if( file.open(QIODevice::WriteOnly) )
    {
        QString dt = "D.T.Software";
        double value = 3.14;

        /*write所操作的数据必须是直接的字节类型数据char
          QString dt:字符换类 先转换为标准的字符串类型,再转换为直接的二进制数据
          reinterpret_cast<char*>(&value): 转换为直接的字节类型数据 char*,即指向字节类型数据

          write(const char* data,qint64 maxSize);
          write(const char* data);
        */
        file.write(dt.toStdString().c_str());
        file.write(reinterpret_cast<char*>(&value), sizeof(value));

        file.close();
    }

    if( file.open(QIODevice::ReadOnly) )
    {
        QString dt = "";
        double value = 0;

        dt = QString(file.read(12));
        file.read(reinterpret_cast<char*>(&value), sizeof(value));

        file.close();

        qDebug() << dt;
        qDebug() << value;
    }
    
    return a.exec();
}

在这里插入图片描述在这里插入图片描述在这里插入图片描述

实验:

#include <QtCore/QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QDataStream>
#include <QDebug>
void text_stream_test(QString f)
{
    QFile file(f);
    if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
    {
        //创建辅助类对象 ,写入的数据全部转换为可读文本,并用IO设备对象地址对其初始化
        QTextStream out(&file);

//向辅助类对象写数据
        out << QString("D.T.Software") << endl;
        out << QString("Result: ") << endl;
        out << 5 << '*' << 6 << '=' << 5 * 6 << endl;
        file.close();
    }
    if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
    {
        QTextStream in(&file);
        //判断有没有读到文件末尾
        while( !in.atEnd() )
        {
            QString line = in.readLine();//读取一行
            qDebug() << line;
        }
        file.close();
    }
}
void data_stream_test(QString f)
{
    QFile file(f);
    if( file.open(QIODevice::WriteOnly) )
    {
        //创建辅助类对象 ,写入的数据根据类型转换为二进制数据,并用IO设备对象地址对其初始化
        QDataStream out(&file);
        out.setVersion(QDataStream::Qt_4_7);
        //将内容输出到一个外部的二进制文件中
        out << QString("D.T.Software");
        out << QString("Result: ");
        out << 3.14;
        file.close();
    }
    if( file.open(QIODevice::ReadOnly) )
    {
        QDataStream in(&file);
        QString dt = "";
        QString result = "";
        double value = 0;
        in.setVersion(QDataStream::Qt_4_7);
        //通过文件辅助对象 将二进制文件中的二进制数据 传出
        in >> dt;
        in >> result;
        in >> value;
        file.close();
        qDebug() << dt;
        qDebug() << result;
        qDebug() << value;
    }
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    text_stream_test("C:/Users/hp/Desktop/text.txt");
    data_stream_test("C:/Users/hp/Desktop/data.dat");
    
    return a.exec();
}

在这里插入图片描述

Qt 框架中,`QFile` `QDataStream` 是用于文件操作数据序列化的重要类。它们可以结合使用,实现对文本或二进制数据的读写[^2]。 ### QFile 的基本用法 `QFile` 提供了对文件的基本访问功能,它继承自 `QIODevice`,因此可以与 `QTextStream` 或 `QDataStream` 一起使用来处理文件内容。 #### 打开文件 要打开一个文件进行读取或写入,需要调用 `open()` 方法,并传入适当的模式标志: ```cpp QFile file("example.txt"); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { // 文件已以只读模式打开 } ``` 上述代码尝试以只读文本模式打开名为 `example.txt` 的文件。如果成功,则可以继续进行读取操作。 #### 关闭文件 完成文件操作后,应调用 `close()` 方法关闭文件: ```cpp file.close(); ``` ### QDataStream 的基本用法 `QDataStream` 类提供了将 C++ 基本类型以及 Qt 数据类型(如 `QString`、`QList` 等)序列化为二进制格式的能力。它非常适合用于保存应用程序的状态或者在网络上传输数据。 #### 写入数据到文件 以下示例演示如何使用 `QDataStream` 向文件中写入数据: ```cpp QFile file("data.dat"); if (file.open(QIODevice::WriteOnly)) { QDataStream out(&file); out << (qint32)123 << QString("Hello, world!"); } ``` 此段代码创建了一个名为 `data.dat` 的文件,并向其中写入了一个整数一个字符串。注意这里强制转换 `(qint32)` 是为了确保跨平台兼容性[^2]。 #### 读取数据从文件 读取之前写入的数据同样简单: ```cpp QFile file("data.dat"); if (file.open(QIODevice::ReadOnly)) { QDataStream in(&file); qint32 number; QString string; in >> number >> string; qDebug() << "Number:" << number << ", String:" << string; } ``` 这段代码会从 `data.dat` 中读取出先前存储的整数值字符串值[^4]。 #### 使用原始数据函数 对于更底层的操作,比如直接处理内存中的原始字节流,可以使用 `writeRawData()` `readRawData()` 函数配对来进行非结构化的原始数据传输: ```cpp char data[256]; // ... 填充 data ... out.writeRawData(data, sizeof(data)); ``` 而在另一端则可以用类似方式读回这些数据: ```cpp char buffer[256]; in.readRawData(buffer, sizeof(buffer)); ``` 这种方法绕过了 Qt 对特定类型的自动编码/解码机制,适用于需要精确控制输出格式的情况[^3]。 ### 版本控制 当使用 `QDataStream` 进行持久化存储时,建议设置流的版本号,这有助于保证不同版本 Qt 应用程序之间的向后兼容性: ```cpp out.setVersion(QDataStream::Qt_5_12); ``` 选择合适的版本号取决于你的项目需求及目标环境下的 Qt 版本支持情况[^4]。 ### 总结 - **QFile** 是基础的文件访问接口,支持多种打开模式。 - **QDataStream** 提供了强大的二进制序列化功能,适合复杂对象图谱的存取。 - 结合两者可以构建高效稳定的文件 I/O 解决方案。 - 注意始终检查文件是否正确打开,并妥善处理错误条件。 通过以上介绍,应该能够开始着手开发涉及文件读写的 Qt 应用了。记得根据实际应用场景选取合适的技术手段并做好异常处理工作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值