QT系列—读写文件篇

QT读写文件篇


​ 文件的读写是很多应用程序具有的功能,甚至某些应用程序就是围绕着某一种格式文件的处理而开发的,所以文件读写是应用程序开发的一个基本功能。

​ 如下图1所示文件读写测试用例,包括了文本文件的读写和二进制文件的读写功能,打开文件为读文件的过程,保存文件为写文件过程。

在这里插入图片描述

​ 图1 文件读写测试用例图

1、纯文本文件读写方法

​ 文本文件是指以纯文本格式存储的文件,例如用 QT 编写的C++程序的头文件(上文件)和源程序文件(.cpp 文件)。HTML 和 XML 文件也是纯文本文件,使用文本编辑器打开该文件可以编辑和查看该文件内容。

1.1 QFile 类的 IODevice 方法直接进行文件读写

​ QFile提供了从文件中读取和写入数据的能力。我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象后使用setFileName()来修改。

void Widget::on_Button_QfileOpen_clicked()
{
    //通过文件对话框打开获取文件路径
    QString path = QFileDialog::getOpenFileName(this, "打开", "../", "TXT(*.TXT)");

    if (path.isEmpty() == false)
    {
        QFile file(path);
        bool b_open = file.open(QIODevice::ReadOnly);

        if (b_open == true)
        {
            QByteArray arr;
            arr = file.readAll();
            //字节数组QByteArray->QString转换
            ui->textEdit->setText(QString(arr)); //QFile只支持UTF-8格式
        }

        file.close();
    }
}

void Widget::on_Button_QfileSave_clicked()
{
    //通过文件对话框打开获取文件路径
    QString path = QFileDialog::getOpenFileName(this, "保存", "../", "TXT(*.TXT)");
    if (path.isEmpty() == false)
    {
        QFile file;
        //关联文件名字
        file.setFileName(path);

        bool b_open = file.open(QIODevice::WriteOnly);

        if (b_open == true)
        {
            //QFile只支持UTF-8格式
            QString str = ui->textEdit->toPlainText();
            file.write(str.toUtf8());
        }
        file.close();
    }
}

1.2 QFile 和 QTextStream 结合的方法进行文件读写

​ 在创建 QTextStream 实例时传递一个 QFile 对象,这样,QFile 对象和 QTextStream 对象就结合在一起了,利用 QTextStream 可读写文件。如果文本文件里有汉字,需要设定为自动识别 Unicode 码,即调用 setAutoDetectUnicode(true) 函数。

void Widget::on_Button_QtsOpen_clicked()
{
    //通过文件对话框打开获取文件路径
    QString path = QFileDialog::getOpenFileName(this, "打开", "../", "TXT(*.TXT)");

    //文件存在
    if (path.isEmpty() == false)
    {
        QFile file(path);

        bool b_open = file.open(QIODevice::ReadOnly);
        if (b_open == true)
        {
            //创建数据流,和file文件关联
            //往文本流中读取数据,相当从文件里读数据
            QTextStream stream(&file);
            QString str;
            stream >> str;
            stream.setAutoDetectUnicode(true)  //自动检测Unicode,才能正常显示文档内的汉字
            ui->textEdit->setText(str.toUtf8().data());
        }
    }
}

void Widget::on_Button_QtsSave_clicked()
{
    //通过文件对话框打开获取文件路径
    QString path = QFileDialog::getOpenFileName(this, "保存", "../", "TXT(*.TXT)");
    if (path.isEmpty() == false)
    {
        QFile file;
        //创建数据流,和file文件关联
        //往文本流中写入数据,相当往文件里写数据
        file.setFileName(path);

        bool b_open = file.open(QIODevice::WriteOnly);
        if (b_open == true)
        {
            QTextStream stream(&file);
            QString str = ui->textEdit->toPlainText();
            stream << str;
        }

        //关闭文件保存,保存格式为txt文件
        file.close();
    }
}

2、二进制文件读写方法

​ QDataStream提供了基于QIODevice的二进制数据的序列化。数据流是一种二进制流,这种流完全不依赖于底层操作系统、CPU 或者字节顺序(大端或小端)。例如,在安装了 Windows 平台的 PC 上面写入的一个数据流,可以不经过任何处理,直接拿到运行了 Solaris 的 SPARC 机器上读取。由于数据流就是二进制流,因此我们也可以直接读写没有编码的二进制数据,例如图像、视频、音频等。

​ QDataStream既能够存取 C++ 基本类型,如 int、char、short 等,也可以存取复杂的数据类型,例如自定义的类。实际上,QDataStream对于类的存储,是将复杂的类分割为很多基本单元实现的。

void Widget::on_Button_QdsOpen_clicked()
{
    //通过文件对话框打开获取文件路径
    QString path = QFileDialog::getOpenFileName(this, "打开", "../", "TXT(*.TXT)");

    if (path.isEmpty() == false)
    {
        QFile file(path);

        bool b_open = file.open(QIODevice::ReadOnly);
        if (b_open == true)
        {
            //创建数据流,和file文件关联
            //往数据流中读取数据,相当从文件里读数据
            QDataStream stream(&file);
            QString str;
            int a;
            stream >> str >> a;
            qDebug() << str.toUtf8().data() << a;
            QString t = QString::number(a, 10);
            QString txt = str + t;
            ui->textEdit->setText(txt.toUtf8().data());
        }
    }
}

void Widget::on_Button_QdsSave_clicked()
{
    //通过文件对话框打开获取文件路径
    QString path = QFileDialog::getOpenFileName(this, "保存", "../", "TXT(*.TXT)");
    if (path.isEmpty() == false)
    {
        QFile file;
        //创建数据流,和file文件关联
        //往数据流中写入数据,相当往文件里写数据
        file.setFileName(path);

        bool b_open = file.open(QIODevice::WriteOnly);
        if (b_open == true)
        {
            QDataStream stream(&file);
            stream << QString("二进制数据流保存测试") << 888;
        }

        //关闭文件保存,保存格式为二进制文件
        file.close();
    }
}
)
        {
            QDataStream stream(&file);
            stream << QString("二进制数据流保存测试") << 888;
        }

        //关闭文件保存,保存格式为二进制文件
        file.close();
    }
}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CPUOS2010

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

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

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

打赏作者

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

抵扣说明:

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

余额充值