Qt中对文件读写操作

tech2025-10-03  2

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)、如读取文件前 8 8 8 行,代码如下:

(2)、运行的结果如下,只显示前 8 8 8行:

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,其返回值类型为QByteArrayQByteArray可以直接转换成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(); }

结果如下:

最新回复(0)