QT系列—读写文件篇

QT读写文件篇

文章目录

  • QT读写文件篇
    • 1、纯文本文件读写方法
      • 1.1 QFile 类的 IODevice 方法直接进行文件读写
      • 1.2 QFile 和 QTextStream 结合的方法进行文件读写
    • 2、二进制文件读写方法

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

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

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();
    }
}

你可能感兴趣的:(QT+Python,c++,qt,前端)