Qt中自己定义一套对文件的读写操作:QFile
常用的读写模式如下:
-
QIODevice::ReadOnly
:文件以只读的形式打开 -
QIODevice::WriteOnly
:文件以写的形式打开,该方式写入的新内容会覆盖掉之前的内容。 -
QIODevice::ReadWrite
:文件以读写的方式打开 -
QIODevice::Append
:文件以追加的方式打开,新写入的内容会被添加到文件的末尾,原来的内容会被保留 -
QIODevice::Text
:将每行的结束字符根据具体的环境转换成对应的形式,一般都附带该项 -
QIODevice::Truncate
:以截断的方式来打开文件 -
QIODevice::NotOpen
:文件没有被打开
一、创建一个窗口程序来选择某一路径下的文件,读取其所有内容
Qt 默认支持格式为UTF-8
,如果读取的文件为GBK
或者ANSI
格式,则需要特别设置读取文件格式。
1、ui
页面的设置布局
- 首先分别添加控件
LineEdit
、TextEdit
、PushButton
、Widget
。其中LineEdit
和PushButton
位于Widget
控件中。其整体竖直布局,结果如下:
2、使用readAll
一次读取所有内容的代码实现如下:
3、运行的结果如图:
(1)、读取UTF-8
格式文件,正常显示如下:
(2)、读取gbk
格式文件时,中文字体将出现乱码,如下图:
4、根据文件编码类型设置对应的编码格式
(1)、设置读取读取编码格式的类为QTextCodec
,修改的代码部分如下:
(2)、运行结果gbk
格式文件可以正常读取,但utf-8
将会出现乱码
二、逐行读取文件内容
-
readLine()
逐行读取,并保留换行符等格式。 -
atEnd()
判断是否到文件的末尾结束位置
1、以逐行的形式读取文件的全部内容,
(1)、具体代码如下
(2)、读取的文件全部内容如下:
2、只读取文件前面几行
(1)、如读取文件前
(2)、运行的结果如下,只显示前行:
3、只读取文件后面几行
(1)、读取文件后8行,mainwindow.cpp
代码如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog> //用于弹出文件对话框,供选择文件
#include<QFile> //用于读取文件内容
#include<QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//点击选取文件按钮,打开文件对话框
connect(ui->btnPath,&QPushButton::clicked,this,[=]{
QString filePath = QFileDialog::getOpenFileName(this,"打开文件","D:\\Temp");
//将文件的绝对路径放到 lineEdit
ui->lineEdit->setText(filePath);
//将文件的内容读取出来,显示到 TextEdit 上
QFile file(filePath);//该对象用来计算总的行数
QFile file2(filePath);//该对象用来打印具体的数据
//对绑定的文件进行操作,首先设置打开的方式为只读
file.open(QIODevice::ReadOnly);
file2.open(QIODevice::ReadOnly);
//逐行读取文件内容,以字节数组的形式来保存
QByteArray arr;
//统计总的行数
int linesNum=0;
while(!file.atEnd())
{
arr=file.readLine();
++linesNum;
}
file.close();
//要打印末尾的行数
int printCounts=8;
//总的行数小于待打印的行数时,全部打印出来。
if(linesNum<=printCounts)
{
while(!file2.atEnd())
{
arr+=file2.readLine();
}
}
else
{
int curIndex=linesNum-printCounts+1;
while(curIndex)
{
arr=file2.readLine();
--curIndex;
}
while(!file2.atEnd())
{
arr+=file2.readLine();
}
}
//将文件内容显示出来。QByteArray 可以直接转换成 QString
ui->textEdit->setText(arr);
file2.close();
});
}
MainWindow::~MainWindow()
{
delete ui;
}
(2)、运行结果如下,只显示后8行:
三、读取文件方法总结
1、直接读取文件的内容
- 使用
QFile
类的readLine()
或者readAll()
函数来进行读取 -
readLine()
和readAll()
属于类QIODevice
,其返回值类型为QByteArray
-
QByteArray
可以直接转换成QString
/****** 测试代码如下 *********/
#include "ReadFile.h"
#include<qfile.h>
#include<qdebug.h>
#include<iostream>
#include<qstring.h>
ReadFile::ReadFile(QWidget *parent)
: QMainWindow(parent)
{
//在VS中的Qt项目中,ui的类型是类的对象,而在QtCreator中ui的类型是指针
//在两种IDE中其调用的方式有些许的差别。
ui.setupUi(this);
QString fileName = "D:\\WSpace\\TheData\\TestResult\\TestRecord.txt";
QFile file(fileName);
if (!file.exists())
{
qDebug() << "The file is not exist!" << endl;
return;
}
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QByteArray line01, line02;
while (!file.atEnd())
{
line01 += file.readLine(); //逐行读取的方式读取全部内容。
}
line02 = file.readAll();//一次读取全部内容。
ui.textEdit->setText(line01);
file.close();
}
2、通过Streams
流来读取文件内容
- 通过
QTextStream
类的readLine()
或者readAll()
函数来进行读取 -
readLine()
和readAll()
在此属于类QTextStream
,其返回值类型为QString
类型 - 这种方式与原始的C++中的流方法相同,将文件绑定到流对象上,通过流对象来进行操作文件
#include "ReadFile.h"
#include<qfile.h>
#include<qdebug.h>
#include<iostream>
#include<qstring.h>
ReadFile::ReadFile(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
QString fileName = "D:\\WSpace\\TheData\\TestResult\\TestRecord.txt";
QFile file(fileName);
if (!file.exists())
{
qDebug() << "The file is not exist!" << endl;
return;
}
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in(&file);//将文件绑定到流对象上
QString line01, line02;
while (!in.atEnd())
{
line01 += in.readLine();//逐行读取文件内容
}
line02 = in.readAll();//一次全部读取文件内容
ui.textEdit->setText(line01);
file.close();
}
四、向文件中写入内容
1、QFile
直接写入内容
- 利用
QFile
的write()
函数直接进行写入操作 -
write()
函数是QFile
类继承自QIODevice
类而来的 - 该方法写入前会先自动判断是否存在目标文件,若没有就会自动创建,并写入内容
- 默认是以
UTF-8
的格式写入数据
#include "QtWriteFile.h"
#include<qfile.h>
#include<qtextstream.h>
QtWriteFile::QtWriteFile(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//创建对象并绑定到对应文件
QString fileName = "D:\\Temp\\writeFile03.txt";
QFile file(fileName);
//设定文件的打开方式
file.open(QIODevice::Append | QIODevice::Text);
//向文件中写入内容
file.write("Hello this is just a write test.\nThanks ....!\n");
file.close();
}
2、利用Streams
流来写入内容
-
QTextStream
流重载了<<
符号,可以直接用该符号来写入内容 - 可以直接通过
setCodec()
设定流的编码方式 - 当指定的文件不存在时,会自动创建对应的文件并写入内容
- 也可以通过控制台来写入内容
(1)、在程序内部不通过控制台写入内容:
#include "QtWriteFile.h"
#include<qfile.h>
#include<qtextstream.h>
QtWriteFile::QtWriteFile(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//创建文件对象,并用指定文件进行初始化
QString fileName = "D:\\Temp\\writeFile.txt";
QFile file(fileName);
//设置文件的打开方式
file.open(QIODevice::Append | QIODevice::Text);
//创建流对象,并将其绑定到对应文件上
QTextStream out(&file);
//设置文件的写入编码格式
out.setCodec("UTF-8");
//写入文件的内容
QString strContent = "Hello this is just a test for QTextStream.\n";
out << strContent;
out << "Qt Project " << 99 << "\n";
file.close();
}
(2)、通过控制台来交互的写入内容:
- 输入输出流的格式有,
stdin
:输入流;stdout
:输出流;stderr
:输出错误信息 - 通过
QTextStream
创建流对象,并设定为输入流 -
readLineInto()
:每次可以输入一行的内容,以换行符作为结束符。返回值为bool
类型 -
>>
每次输入以空格作为结束符
#include "QtWriteFile.h"
#include<qfile.h>
#include<qtextstream.h>
#include<qdebug.h>
QtWriteFile::QtWriteFile(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
//创建文件对象,并用指定文件进行初始化
QString fileName = "D:\\Temp\\writeFile.txt";
QFile file(fileName);
//设置文件的打开方式
file.open(QIODevice::Append | QIODevice::Text);
//创建流对象,并将其绑定到对应文件上,用于向其写入数据
QTextStream out(&file);
//创建流对象,并设定其为输入流
QTextStream in(stdin);
QString strContent;
//设置文件的写入编码格式
out.setCodec("UTF-8");
qDebug() << "Please input some string for test: " << endl;
//in >> strContent;//每次遇到空格就结束
//out << strContent;//将控制台的输入内容,写入到文件中
in.readLineInto(&strContent);//每次可以输入一行内容,以换行符作为结束符
qDebug() << strContent << endl;
out << strContent;
file.close();
}
结果如下: