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

学习C++、QT---21(QT中QFile库的QFile读取文件、写入文件的讲解)

每日一言

        把大目标拆成小步,每天前进一点点,终会抵达终点。

QFile读取文件

我们记事本要进行读取文件、写入文件、等等的操作,那么这个时候我们的QT有一个QT类叫做QFile这个类的话是专门对于文件操作的,所以我们来学习

我们在QT的帮助文档这边进行查看,会发现这边包含了几个公共的函数,那么他们之间有什么联系呢?

二、QFile 与 setFileName 的关系

  1. 关联文件路径的方式
    QFile 要操作文件,得知道文件路径。有两种常见方式:
    1. 构造时指定:通过带 name 参数的构造函数,比如 QFile(const QString &name) ,创建对象时就确定好要操作的文件

例如QFile file("test.txt"); ,后续对 file 的操作就围绕 test.txt 这个文件。

    1. 先创建对象再设置:先用无参构造(QFile() )或者带父对象的构造(QFile(QObject *parent) )创建 QFile 对象,此时对象还没关联具体文件,接着调用 setFileName 函数传入文件路径,来建立关联,例如:

   QFile file;

  file.setFileName("test.txt");

之后就可以用 file 操作 test.txt 文件,比如打开、读写等

  1. 存在的意义
    setFileName 提供了灵活设置文件路径的能力。有些场景下,创建 QFile 对象时还不确定要操作哪个文件(比如文件路径由用户后续选择、从配置中读取等 ),就可以先创建对象,后续再用 setFileName 来指定,让代码逻辑更灵活。

这个是我们的运行结果,我们使用创建对象的方法,对象调用这个setFileName(“文件地址”)。

file.open(以怎么样的方式打开)

Open的模式在这个QIODevice这个类里面

我们找到后会发现,有可读可写,追加等等方式,那么我们这边选择只读和Text,这个Test这个的话是什么意思呢?就是简单来说,就是 Qt 帮开发者处理了不同平台换行符不一致的问题,让文本的读写在跨平台场景下更顺畅,减少了因换行符差异带来的适配工作量 。

那么我们通过管道(按位或)来进行连接

  • |(按位或):用于组合多个选项,是打开文件时的正确写法。

我们打开后需要进行读取操作使用file.read()

这个操作就是,我们可以知道read里面的参数填什么,看到需要填写一个是数组指针,一个是长度

  • 参数
    • data:指向用于存储读取数据的 ** 字符数组(缓冲区)** 的指针。
    • maxSize:指定最多读取的字节数,即缓冲区的最大容量。

那么我们进行定义一个数组,将数组名传进去,这边的话我们需要对数组进行初始化,那我们就都初始化为\0吧,空字符

//在 C/C++ 里,当你对数组进行部分初始化时(也就是只显式初始化数组的部分元素),剩余未显式初始化的元素会被编译器自动初始化为对应类型的 “零值” 

  • read() 的作用:将文件内容直接复制到 context 数组的内存空间中。
    例如,若文件内容是 "Hello\nWorld!"(共 12 字节),则 context 数组的前 12 个字节会被填充为对应的字符编码(如 UTF-8),后续字节保持为 '\0'

qDebug() 如何输出内容?

C 风格字符串的特性
context 是一个 char* 类型的指针,指向数组的首地址。qDebug() 会将其视为以 '\0' 结尾的 C 风格字符串,并从首地址开始逐字节读取,直到遇到第一个 '\0' 为止。

好的,那么我们的文件会其实是会打开失败的啊

我们进行了一个判断,为什么可以这样判断?

因为

 Qt 的 QFile::open()

在 Qt 中,QFile::open() 返回bool

  • 成功打开:返回true
  • 打开失败:返回false,可通过QFile::error()获取具体错误类型。

所以我们就直接如果返回值为!1的那我们就输出错误信息file open error。

还有这个read这个是失败返回-1的,所以我们就可以当==-1的时候,我们就直接退出程序。

还有一种写法是这样的

 

QFile写入文件

这个写入文件的话也是一样的操作,路径、打开文件、写入内容、关闭资源

不同的就是这个open的打开方式改为关于写的,我这边是只写WriteOnly

然后我们看到上方的框框 ,我点击写入文件的话,如果我在这个路径上面没有这个文件的话就会创建一个这个文件,然后写入了我写的话,我们这个write的参数是可以填写三个,一个是字符数组(c风格字符串),QByteArray、还有一个是字符串加上存入的指定的大小

http://www.dtcms.com/a/273550.html

相关文章:

  • 部署 React + Vite + TypeScript 项目到阿里云 ECS
  • ARMv9架构
  • tcp/quic 的滑动窗口
  • 飞算 JavaAI 体验:重塑 Java 开发的智能新范式
  • Element Plus和Ant Design Vue深度对比分析与选型指南
  • WD0407 40V 7A 超级肖特基二极管,应用于开关汽车工业控制
  • 【字节跳动】数据挖掘面试题0015:100 亿个单词,找出出现频率最高的单词。要求几种方案
  • 20250711荣品RD-RK3588开发板在Android13下的开机自启动的配置步骤
  • React之旅-05 List Key
  • 进制转换原理与实现详解
  • cyvcf2 知识点详解
  • MYSQL C_API使用全解
  • 基于gitlab 构建CICD发布到K8S 平台
  • Java大厂面试实录:谢飞机的电商场景技术问答(Spring Cloud、MyBatis、Redis、Kafka、AI等)
  • 飞算Java AI:专为 Java 开发者打造的智能开发引擎
  • 后台管理系统-权限管理
  • 云、实时、时序数据库混合应用:医疗数据管理的革新与展望(下)
  • 从Markdown到PPT:用Python打造专业演示文稿转换器
  • 2025前端面试真题以及答案-不断整理中,问题来源于牛客真题
  • 面具贴纸美颜SDK如何集成进直播APP?技术细节与性能优化实战
  • 百度2026届校招开启,大规模发力AI的百度未来何在?
  • PPT处理控件Aspose.Slides教程:使用 C# 将 PPTX 转换为 EMF
  • 【Linux仓库】命令行参数与环境变量【进程·伍】
  • 语音对话秒译 + 视频悬浮字 + 相机即拍即译:ViiTor 如何破局跨语言场景?
  • Django快速入门搭建网站
  • Monorepo 与包管理工具:从幽灵依赖看 npm 与 pnpm 的架构差异
  • Django母婴商城项目实践(二)
  • 行测之地理常识
  • Linux进程间通信--命名管道
  • 用TensorFlow进行逻辑回归(一)