对于文件的读写操作,C 和 C++ 都各有一套方式。而在 Qt 中也有一套,即使用 QFile 对文件进行读和写操作。

文件的打开方式

在这里插入图片描述
文件路径说明:(windows-release编译)

QFile *file = new QFile("EcgCap.dat");

表示这个文件默认在(与Makefile同级)
在这里插入图片描述
而非.pro文件的同级目录中,也不是release文件下。

对文件进行读操作

首先创建一个新的工程,以下操作为了迎合 嵌入式Linux 开发,决定在 ubuntu 中进行,并使用 rsync 进行远程调试。

首先,窗体中搭建一个场景,并且将窗体固定为开发板屏幕的大小为1024 * 600 。

搭建步骤如下:首先,将控件 LineEdit 和 PushButton 放入到 Widget 控件中,然后点击选中 Widget 控件 ,使用水平对齐,之后将控件 TextEdit 拖拽到窗体上(通过拉伸,将该控件拉大一些),最后,选中整个窗体,使用垂直对齐,就变成下图所示了
在这里插入图片描述
其次,想要实现这样一个目的:当点击 选取文件 按钮时,弹出一个文件对话框,然后把选取的文件路径放到 LineEdit 控件中,文件中的具体内容则显示在 TextEdit 中。我在目录为 /work/resource/ 中准备了两个文件,文件内容一样,采用不同的编码,如下图所示。
在这里插入图片描述
切换到代码 mainwindow.cpp 来。

在前面,我们已经介绍了文件对话框的相关知识,如果不清楚可以翻到前面看下。

代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //点击新建按钮,弹出一个文件对话框
    connect(ui->pushButton,&QPushButton::released,[=](){
        //文件对话框 -- 返回选中文件的文件路径
        QString path = QFileDialog::getOpenFileName(this,"选取文件","/home/chantui/work/resourceFile","Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)");
        //将路径放入到 LineEdit 控件中
        //一般设置文本的函数都叫做setText
        ui->lineEdit->setText(path);

        //读取内容放到 TextEdit 控件中
        QFile file(path);//参数就是读取文件的路径
        //设置打开方式(读还是写或是其他)
        file.open(QIODevice::ReadOnly);
        //通过readAll函数可以将文件内容都给读出来
        //这个函数返回一个 QByteArray 类类型的值,因此可以去接收这个返回值
        QByteArray bytearray = file.readAll();
        //将读取到的数据放入到 textEdit 中,同样使用 setText 这个函数
        //因为 setText 这个函数所需要的参数是 QString 类型,所以需要进行格式转换
        //但这里在编译的时候会自动进行隐式转换,所以并不需要进行格式转换。
        ui->textEdit->setText(bytearray);
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

运行结果如下:

打开 utf8 编码的文件,结果如下:
在这里插入图片描述
打开 ansi 编码的文件,结果如下:(可以使用抛出异常的方式来解决
在这里插入图片描述
QFile 默认支持的是 utf8 格式(Unicode编码的一种),而ANSI格式的文件则是GBK编码。 那 QFile 就没有办法读取了吗?并不是,需要用到 QT 中编码格式的一个类 QTextCodec 。

使用 QTextCodec 这个类需要添加头文件 #include <QTextCodec>

之后,使用这个类中的一个静态方法 codecForName , 并传入将要读取到的文件(字符串)的编码格式是什么。

//codecForName 是这个类中的一个静态方法,这里指定以"gbk"的编码格式来读取
QTextCodec *codec = QTextCodec::codecForName("gbk");

之后,传入要读取文件的路径,指定打开方式,并读取文件内容。

QFile file(path);//参数就是读取文件的路径
//设置打开方式(读还是写或是其他)
file.open(QIODevice::ReadOnly);
//通过readAll函数可以将文件内容都给读出来
//这个函数返回一个 QByteArray 类类型的值,因此可以去接收这个返回值
QByteArray bytearray = file.readAll();

最后,也是关键的一步骤,将读取到的文件内容先转换成 Unicode 编码格式(需要用到 toUnicode() 这个函数),再显示出来。

 ui->textEdit->setText(codec->toUnicode(bytearray));

运行代码来看下:
在这里插入图片描述
但是,当这样转换之后,又不支持 utf8 格式的文件了,来看下。
在这里插入图片描述
因此,如果要同时支持的话,就需要做一个判断,恰好在 " 电子书 " 这个项目中,我学会了。^ _ ^

在前面代码中,我们采用的是 readAll() 这种方法将文本内容直接读取出来了,下面再来介绍另外一种方式 readAll() — 按行来读取。

代码如下:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //点击新建按钮,弹出一个文件对话框
    connect(ui->pushButton,&QPushButton::released,[=](){
        //文件对话框 -- 返回选中文件的文件路径
        QString path = QFileDialog::getOpenFileName(this,"选取文件","/home/chantui/work/resourceFile","Images (*.png *.xpm *.jpg);;Text files (*.txt);;XML files (*.xml)");
        //将路径放入到 LineEdit 控件中
        //一般设置文本的函数都叫做setText
        ui->lineEdit->setText(path);

        //读取内容放到 TextEdit 控件中
        QFile file(path);//参数就是读取文件的路径
        //设置打开方式(读还是写或是其他)
        file.open(QIODevice::ReadOnly);

        QByteArray array;

        //通过readline函数一行一行的将文件内容给读出来
        //通过atEnd()这个方法来判断是否读到文件尾
        while(!file.atEnd())
        {
            array += file.readLine();
        }

        ui->textEdit->setText(array);
    });
}

运行结果也跟上面一样(读取的是 utf8 格式的文件)。

上面一直忘了一件很重要的事情就是不对文件进行操作时,要关闭文件。

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //点击新建按钮,弹出一个文件对话框
    connect(ui->pushButton,&QPushButton::released,[=](){
		...
		...
		...
        
        //对文件对象进行关闭
        file.close();
    });
}

对文件进行写操作

如果采用只写( WriteOnly )的方式打开文件,源文件中的内容会被覆盖。这里采用追加(Append)的方式来打开文件,再进行写操作。

//设置打开方式(追加的方式打开,然后再写)
file.open(QIODevice::Append);
file.write("实干兴邦");
file.close(); 
GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐