Qt -- QFile文件读写操作
对于文件的读写操作,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();
更多推荐
所有评论(0)