Qt文件操作
QFile是Qt中用于文件处理的类,提供了读取和写入文件的功能,支持文本和二进制文件。
可在“帮助”文档中搜索其用法
打开文件
先在任意位置创建一个测试的文本文件
新建一个项目,右键“打开”按钮,点击“转到槽”
引入头文件
使用QFile需要引入头文 件。在Qt中引入头文件,可以将光标放到要指定位置,ALT+ENTER同时按下,就会显示所属的头文件,按下回车键就会自动添加
也可以右键,“Refactor”引入所属头文件
实例化QFile对象
使用QFile(const Qstring &name)构造函数实例化一个QFile对象
open方式打开
需要一个打开方式的参数
QFile继承于QIODevice,打开模式有以下几种(只读,只写,可读可写等等)
这样就是以只读的方式打开
若还想同时以其它方式读取,则使用“|”符号。如下示例为“只读+文本”读取方式
open的返回值是一个bool类型,我们可以判断一下文件是否正常打开(正常返回1)
读取文件
使用read方法
输入read后,右下角会给出方法使用提示,需要两个参数(一个指针,一个字节大小)
先开辟一个字符数组用来存储文本,再用.read方法读取文件
开辟数组大小时,也可以先使用size方法获取文件大小,再开辟,如
int size = file.size();
char* context = new char(size);
read的返回值是整形,如果读取失败则返回-1,我们也可以检测一下(读取失败函数直接返回)
文件地址写法
我们可以将读取的文件输出看看(注意,前面文件地址的写法有误,不能直接复制使用,应该是用/分割)
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设置编码
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();
}
不知道大小时,还可以按行读取(判断是否在文件末尾,不是则继续一行一行读取)
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();
}
写入
使用插入运算符<<写入
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代码
#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对象
QFileDialog qFileDialog;
设置模式,有以下4种模式,默认为AnyFile所有文件
qFileDialog.setFileMode(QFileDialog::ExistingFile); //打开已经存在的文件
设置文件类型过滤器
qFileDialog.setNameFilter("*.txt");
显示对话框
qFileDialog.exec();
获取用户选择的文件,返回的是一个字符串数组,可以遍历输出所有选择的文件
QStringList files=qFileDialog.selectedFiles();for(QString file:files){qDebug()<<file;}
运行效果如下,可输出选择的多个文件
创建文件
再创建一个“保存文件”的按钮,右键“转到槽”
生成文件名
调用QFileDialog的静态成员函数getSaveFileName,返回完整文件名
QString fileName = QFileDialog::getSaveFileName(this,tr("Save File"),"D:/codefile/Qt code",tr("Text(*.txt *.doc)"));
若文件路径不存在,如下,则会返回当前的工作文件夹
实例化QFile对象
QFile qFile(fileName);
打开文件
if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){qDebug()<<"file open error";
}
写入文件
QTextStream out(&file);out.setCodec("UTF-8");out<<"I create a file.";
关闭文件
file.close();
点击“保存文件”,运行效果如下
输出补充
在使用qDebug()输出读取的文件时,可以使用qPrintable宏,它能把QString转换成const char *,这样qDebug()就不会打印带引号的QString,而是直接打印原始文本内容
qDebug()<<qPrintable(context);