QFile是Qt中用于文件处理的类,提供了读取和写入文件的功能,支持文本和二进制文件。
可在"帮助"文档中搜索其用法

打开文件
先在任意位置创建一个测试的文本文件

新建一个项目,右键"打开"按钮,点击"转到槽"

引入头文件
使用QFile需要引入头文 件。在Qt中引入头文件,可以将光标放到要指定位置,ALT+ENTER同时按下,就会显示所属的头文件,按下回车键就会自动添加
也可以右键,"Refactor"引入所属头文件
实例化QFile对象
使用QFile(const Qstring &name)构造函数实例化一个QFile对象

open方式打开
需要一个打开方式的参数
QFile继承于QIODevice,打开模式有以下几种(只读,只写,可读可写等等)

这样就是以只读的方式打开

若还想同时以其它方式读取,则使用"|"符号。如下示例为"只读+文本"读取方式

open的返回值是一个bool类型,我们可以判断一下文件是否正常打开(正常返回1)

读取文件
使用read方法
输入read后,右下角会给出方法使用提示,需要两个参数(一个指针,一个字节大小)

先开辟一个字符数组用来存储文本,再用.read方法读取文件

开辟数组大小时,也可以先使用size方法获取文件大小,再开辟,如
cpp
int size = file.size();
char* context = new char(size);
read的返回值是整形,如果读取失败则返回-1,我们也可以检测一下(读取失败函数直接返回)

文件地址写法
我们可以将读取的文件输出看看(注意,前面文件地址的写法有误,不能直接复制使用,应该是用/分割)
cpp
QFile file("D:/codefile/Qt code/test.txt");
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
qDebug() << "File open error.";
}
char context[100]={'\0'};
if(file.read(context,100)==-1) return;
qDebug()<<context;
点击"打开"后,输出效果如下,正是我们文本存储的内容

关闭文件
使用close方法关闭文件,回收资源

写入文件
右键"写入"按钮,点击"转到槽"

实例化QFile对象
使用构造函数实例化一个QFile对象,文件名修改一下为新文件

打开文件
使用只读和文本的方式打开文件
file.open(QIODevice::WriteOnly | QIODevice::Text);
写入文件
使用write方法写入字符数组到文件
file.write("Use qt to write something to this file.");
关闭文件
file.close();
点击写入后,文件夹确实多了一个text2文本文件

文件夹里的内容也确实是我们写入的内容

本示例没有对open,write的返回值进行判断,若追求严谨,可自行添加
编码处理
QTextStream是一个功能强大的用于处理文本数据的类,特别是在需要考虑字符编码和文本格式化的情况下。

读取
windows的记事本编码格式在右下角有显示,我的为"UTF-8"

使用QTextStream设置编码
cpp
void Widget::on_pushButton_clicked()
{
QFile file("D:/codefile/Qt code/test.txt");
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
qDebug() << "File open error.";
}
QTextStream in(&file);
in.setCodec("UTF-8"); //设置编码
QString context=in.read(file.size()); //按大小来读
qDebug()<<context;
file.close();
}
不知道大小时,还可以按行读取(判断是否在文件末尾,不是则继续一行一行读取)
cpp
void Widget::on_pushButton_clicked()
{
QFile file("D:/codefile/Qt code/test.txt");
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
qDebug() << "File open error.";
}
QTextStream in(&file);
in.setCodec("UTF-8");
while(!in.atEnd()){
QString context=in.readLine();
qDebug()<<context;
}
file.close();
}
写入
使用插入运算符<<写入
cpp
void Widget::on_pushButton_2_clicked()
{
QFile file("D:/codefile/Qt code/test2.txt");
file.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&file);
out.setCodec("UTF-8");
out<<"I write a stream char to this file.";
file.close();
}
但使用QTextStream后我本地却不能正常写入中文了,使用write时是可以的,以后还需重新细读文档,欢迎有识之士不吝赐教(QTextStream::setCodec()
这个成员函数 在 Qt 5 里已经被标记为废弃,在 Qt 6 里更是直接删除了,也许我们该自行学点新东西了)
文件选择框
QFileDialog类是一个可以创建文件选择对话框的类
选择单文件
新建项目,右键"打开文件选择框"按钮,点击"转到槽"

先引入<QFileDialog>头文件,再调用QFileDialog的静态成员函数getOpenFileName,返回的是字符串类型为完整文件名,有四个参数(第一个this,指向整个窗体;第二个参数有打开和保存两种模式,现在是打开;第三个参数是打开的文件夹名;第四个参数为限定的打开文件类型(图片、文本...))
文件类型常用的有以下几种

如下为示例的widget.cpp代码
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
QString fileNmae = QFileDialog::getOpenFileName(this,tr("Open File"),"D:/codefile/Qt code",tr("Text(*.txt)"));
qDebug()<<fileNmae;
}
点击按钮后,运行效果如下,只能选择文本文件

点击想打开的文件后,点击"打开",会返回文件的完整地址;若点击取消则返回空字符串


再将代码与读取文件的代码拼接,就实现了选择文件夹文件并读取文件的操作,演示效果如下

选择多个文件
再创建一个按钮,点击"转到槽"

先实例化一个QFileDialog对象
cpp
QFileDialog qFileDialog;
设置模式,有以下4种模式,默认为AnyFile所有文件

cpp
qFileDialog.setFileMode(QFileDialog::ExistingFile); //打开已经存在的文件
设置文件类型过滤器
cpp
qFileDialog.setNameFilter("*.txt");
显示对话框
cpp
qFileDialog.exec();
获取用户选择的文件,返回的是一个字符串数组,可以遍历输出所有选择的文件
cpp
QStringList files=qFileDialog.selectedFiles();
for(QString file:files){
qDebug()<<file;
}
运行效果如下,可输出选择的多个文件


创建文件
再创建一个"保存文件"的按钮,右键"转到槽"

生成文件名
调用QFileDialog的静态成员函数getSaveFileName,返回完整文件名
cpp
QString fileName = QFileDialog::getSaveFileName(this,tr("Save File"),"D:/codefile/Qt code",tr("Text(*.txt *.doc)"));
若文件路径不存在,如下,则会返回当前的工作文件夹

实例化QFile对象
cpp
QFile qFile(fileName);
打开文件
cpp
if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){
qDebug()<<"file open error";
}
写入文件
cpp
QTextStream out(&file);
out.setCodec("UTF-8");
out<<"I create a file.";
关闭文件
cpp
file.close();
点击"保存文件",运行效果如下


输出补充
在使用qDebug()输出读取的文件时,可以使用qPrintable宏,它能把QString转换成const char *,这样qDebug()就不会打印带引号的QString,而是直接打印原始文本内容
cpp
qDebug()<<qPrintable(context);