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

Qt file文件操作详解

1.引言

很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件等等,甚至某些应用程序的就是为了操作文件,像WPS Office。基于此Qt框架中专门提供了对文件操作的类:QFile。

2.QFile文件操作

QFile类支持对文件进行读取和写入,删除,重命名,拷贝等常见的文件操作,它既可以操作文本文件,也可以用来操作二进制文件。

在Qt代码中我们使用QFIle类,需要先引入QFile的头文件:#include <QFile>。常见QFile类对象时,常见的构造函数有:

QFile()
QFile(QObject *parent)

参数parent 用来指定要操作的目标文件,包含文件的存储目录和文件名,存储路径可以使用绝对地址(比如"D:/Demo/text.txt")或者相对路径(比如"./Demo/text.txt")。路径中的分隔符要用"/"表示。

通常情况下,我们一般调用第二个构造函数来直接指明要操作的文件,对于第一个构造函数而言,我们还需要调用 setFileName()函数来指明要操作的文件。

与C++的读写规则一样,在对文件进行相关操作之前,我们需要先打开文件,打开文件我们使用 open函数。常用的语法格式为:

bool QFile::open(OpenMode Mode);

Mode参数表示不同的打开方式,下列罗列了参数的可选值和及其不同的含义:

打开模式含义
QIODevice::ReadOnly以只读模式打开文件。
QIODevice::WriteOnly以只写模式打开文件。如果文件不存在,将创建新文件;如果文件已存在,其内容将被清空。
QIODevice::ReadWrite以读写模式打开文件。
QIODevice::Append以追加模式打开文件,写入的数据将追加到文件末尾,原有内容保留。
QIODevice::Truncate打开文件时清空其内容。通常与 WriteOnlyReadWrite 一起使用。
QIODevice::Text在文本模式下打开文件,处理不同平台的行结束符(如将 Windows 的 \r\n 转换为 \n)。
QIODevice::Unbuffered以非缓冲模式打开文件,数据将直接写入磁盘而不经过缓冲区。

根据需要我们可以一次性选择多个值,值和值之前使用 |来进行分割,比如:

QIODevice::ReadOnly|QIODevice::Text表示只允许对文件进行读操作,读取文件时,会将行尾结束符转换为 ‘\n’;

QIODevice::WriteOnly|QIODevice::Text表示只允许对文件进行写操作,将数据写入文件时,会将行尾结束符转换为本地格式;

QIODevice::ReadWrite|QIODevice::Text| QIODevice::Append

但选择的多个值之前不能相互冲突,比如比如 Append 和 Truncate 不能同时使用。

如果文件成功打开,open() 函数返回 true,否则返回 false。

QFile 类提供了很多功能实用的方法,可以快速完成对文件的操作,下表列举了常用的一些:

qint64 QFile::size() const获取当前文件的大小。对于打开的文件,该方法返回文件中可以读取的字节数。
bool QIODevice::getChar(char *c)从文件中读取一个字符,并存储到 c 中。读取成功时,方法返回 true,否则返回 false。
bool QIODevice::putChar(char c)向文件中写入字符 c,成功时返回 true,否则返回 false。
QByteArray QIODevice::read(qint64 maxSize)从文件中一次性最多读取 maxSize 个字节,然后返回读取到的字节。
qint64 QIODevice::read(char *data, qint64 maxSize)从文件中一次性对多读取 maxSize 个字节,读取到的字节存储到 data 指针指定的内存控件中。该方法返回成功读取到的字节数。
QByteArray QIODevice::readAll()读取文件中所有的数据。
qint64 QIODevice::readLine(char *data, qint64 maxSize)每次从文件中读取一行数据或者读取最多 maxSize-1 个字节,存储到 data 中。该方法返回实际读取到的字节数。
qint64 QIODevice::write(const char *data, qint64 maxSize)向 data 数据一次性最多写入 maxSize 个字节,该方法返回实际写入的字节数。
qint64 QIODevice::write(const char *data)将 data 数据写入文件,该方法返回实际写入的字节数。
qint64 QIODevice::write(const QByteArray &byteArray)将 byteArray 数组中存储的字节写入文件,返回实际写入的字节数。
bool QFile::copy(const QString &newName)将当前文件的内容拷贝到名为 newName 的文件中,如果成功,方法返回 true,否则返回 false。 copy 方法在执行复制操作之前,会关闭源文件。
bool QFile::rename(const QString &newName)对当前文件进行重命名,新名称为 newName,成功返回 true,失败返回 false。
bool QFile::remove()删除当前文件,成功返回 true,失败返回 false。

3.演示示例

3.1实验一

img

演示了 QFile 类读写文本文件的过程

#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{//创建 QFile 对象,同时指定要操作的文件QFile file("D:/demo.txt");//对文件进行写操作if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){qDebug()<<"文件打开失败";}//向文件中写入两行字符串file.write("hello\r\n");file.write("world");//关闭文件file.close();//重新打开文件,对文件进行读操作if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){qDebug()<<"文件打开失败";}//每次都去文件中的一行,然后输出读取到的字符串char * str = new char[100];qint64 readNum = file.readLine(str,100);//当读取出现错误(返回 -1)或者读取到的字符数为 0 时,结束读取while((readNum !=0) && (readNum != -1)){qDebug() << str;readNum = file.readLine(str,100);}file.close();return 0;
}

3.2实验二【演示】

img
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{//指定要写入文件的数据qint32 nums[5]={1,2,3,4,5};//写入文件之前,要将数据以二进制方式存储到字节数组中QByteArray byteArr;byteArr.resize(sizeof(nums));for(int i=0;i<5;i++){//借助指针,将每个整数拷贝到字节数组中memcpy(byteArr.data()+i*sizeof(qint32),&(nums[i]),sizeof(qint32));}//将 byteArr 字节数组存储到文件中QFile file("D:/demo.dat");file.open(QIODevice::WriteOnly);file.write(byteArr);file.close();//再次打开文件,读取文件中存储的二进制数据file.open(QIODevice::ReadOnly);QByteArray resArr = file.readAll();//输出读取到的二进制数据qDebug()<<"resArr: "<<resArr;//将二进制数据转化为整数char* data = resArr.data();while(*data){qDebug() << *(qint32*)data;data += sizeof(qint32);}return 0;
}

执行程序,demo.dat 文件中会存储 {1,2,3,4,5} 这 5 个整数的二进制形式,同时输出以下内容:

image-20250514104431780

4.QFile+QTextStream

与单独使用QFile类相比,QTextStream类提供了很多读写文件相关的方法,还可以设定写入到文件的数据格式,比如对齐方式,写入数据是否带前缀等等。

使用QTextStream类之前,程序中需要先引入 头文件。QTextStream提供了很多构造方法,常用的有

am

与单独使用QFile类相比,QTextStream类提供了很多读写文件相关的方法,还可以设定写入到文件的数据格式,比如对齐方式,写入数据是否带前缀等等。

使用QTextStream类之前,程序中需要先引入 头文件。QTextStream提供了很多构造方法,常用的有

相关文章:

  • 密西根大学新作——LightEMMA:自动驾驶中轻量级端到端多模态模型
  • 服务器时间发生跳变导致hghac中对应主机状态频繁切换为crash或stop
  • OSS-承载数据的巨轮
  • Qt功能区:简介与安装
  • MCU ESP32-S3+SD NAND(贴片式T卡):智能皮电手环(GSR智能手环)性能与存储的深度评测
  • 基于C#实现中央定位服务器的 P2P 网络聊天系统
  • deepseek梳理java高级开发工程师算法面试题
  • windows文件共享另一台电脑资源管理器网络文件夹无法找到机器
  • 数字IC后端零基础入门基础理论(Day2)
  • 【算法】版本号排序
  • Kotlin Compose 与传统 Android UI 开发对比
  • 小白成长之路-Linux用户与组管理(一)
  • 【MCP教程系列】SpringBoot 搭建基于 Spring AI 的 SSE 模式 MCP 服务
  • 【测试】测试基础概念
  • 重塑“DATA+AI“的共生范式:DataBuilder如何赋能企业数据价值跃迁
  • 在K8S集群中部署EFK日志收集
  • ubuntu20.04系统搭建k8s1.28集群-docker作为容器运行时
  • Ubuntu——执行echo $USE什么都不显示
  • tocmat 启动怎么设置 jvm和gc
  • 机器学习第十讲:异常值检测 → 发现身高填3米的不合理数据
  • 全国人大常委会今年将初次审议检察公益诉讼法
  • 上海虹桥国际咖啡文化节周五开幕,来看Coffeewalk通关攻略
  • 国务院关税税则委员会关于调整对原产于美国的进口商品加征关税措施的公告
  • SIFF动画单元公布首批片单:《燃比娃》《凡尔赛玫瑰》等
  • 反制美国钢铝关税!印度拟对美国部分商品征收关税
  • 云南威信麟凤镇通报“有人穿‘警察’字样雨衣参与丧事”:已立案查处