当前位置: 首页 > news >正文

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); 

http://www.lryc.cn/news/627171.html

相关文章:

  • 《算法导论》第 35 章-近似算法
  • 【数据结构】线性表——顺序表
  • RAG流程全解析:从数据到精准答案
  • FreeCAD教程-利用额外的平面和草图工作台的外部几何工具连接不同草图
  • C/C++ 与嵌入式岗位常见笔试题详解
  • DataFrame中.iloc 属性
  • 动态规划----8.乘积最大子数组
  • Docker操作速查表
  • 海量数据测试指南与实战
  • Advanced Math Math Analysis |01 Limits, Continuous
  • C++/Qt开发:TCP通信连接软件测试方法:ECHO指令
  • PyTorch API 5
  • CorrectNav——基于VLM构建带“自我纠正飞轮”的VLN:通过「视觉输入和语言指令」预测导航动作,且从动作和感知层面生成自我修正数据
  • CoreShop微信小程序商城框架开启多租户-添加一个WPF客户端以便进行本地操作(5)
  • 当 AI 开始 “理解” 情绪:情感计算如何重塑人机交互的边界
  • 基于单片机环境火灾安全检测
  • NVIDIA Isaac Sim
  • 48 C++ STL模板库17-容器9-关联容器-映射(map)多重映射(multimap)
  • VR交通安全学习机-VR交通普法体验馆方案
  • 2026 济南淀粉深加工展览会亮点:玉米科技与未来产业发展
  • IPSEC安全基础
  • C++智能指针详解:告别内存泄漏,拥抱安全高效
  • 【科研绘图系列】R语言绘制平滑曲线折线图
  • AI重塑软件测试:质量保障的下一站
  • MySQL分库分表与MyCAT
  • PiscCode集成Hand Landmarker:实现高精度手部姿态检测与分析
  • C语言:第18天笔记
  • Google Chrome扩展不受信任 - 不受支持的清单版本 解决方案 -- Chrome扩展插件无法加载 扩展程序无法使用 解决方案
  • PiscCode使用MediaPipe Face Landmarker实现实时人脸特征点检测
  • vue3 el-select 默认选中第一个