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

C++/Qt 读写文件

之前写过两篇跟文件操作相关的博客,有兴趣也可以看一下:

C语言读写文件

Qt关于文件路径的处理

先讲一些关于基础文本文件和二进制文件的读写操作,后续将会整理C++/Qt关于ini、xml、json、xlsx相关文件的读写操作。

C++

相比于C语言使用FILE文件指针来实现文件操作,C++ 采用的是标准库中的fstream类来实现文件的打开、关闭、读取和写入。

引入头文件:

#include <fstream>

打开文件:

 explicit ifstream(const char* fileName, ios_base::openmode mode = ios_base::in);explicit ifstream(const string& fileName, ios_base::openmode mode = ios_base::in);

第一个参数表示文件名,第二个表示打开方式,关于打开方式有以下几种,以下是官方给出的定义说明:

 // 27.4.2.1.4  Type ios_base::openmode/***  @brief This is a bitmask type.**  @c @a _Ios_Openmode is implementation-defined, but it is valid to*  perform bitwise operations on these values and expect the Right*  Thing to happen.  Defined objects of type openmode are:*  - app*  - ate*  - binary*  - in*  - out*  - trunc*/typedef _Ios_Openmode openmode;/// Seek to end before each write.static const openmode app =		_S_app;/// Open and seek to end immediately after opening.static const openmode ate =		_S_ate;/// Perform input and output in binary mode (as opposed to text mode)./// This is probably not what you think it is; see/// https://gcc.gnu.org/onlinedocs/libstdc++/manual/fstreams.html#std.io.filestreams.binarystatic const openmode binary =	_S_bin;/// Open for input.  Default for @c ifstream and fstream.static const openmode in =		_S_in;/// Open for output.  Default for @c ofstream and fstream.static const openmode out =		_S_out;/// Open for input.  Default for @c ofstream.static const openmode trunc =	_S_trunc;
ios::in以读取的方式打开文件
ios::out以写入的方式打开文件,如果文件不存在则会创建文件
ios::ate打开文件时定位到文件尾部
ios::app以追加的形式打开文件,写入的内容将会添加到文件末尾
ios::trunc打开文件时将清空文件原有的内容
ios::binary以二进制的方式打开文件

这些方式可以采用“|”组合使用,例如:

	fstream file;file.open("1.txt", ios::out | ios::app);

以写入的方式打开文件1.txt,写入的内容将会追加到文件末尾。 

关闭文件:

close()

读取文件示例:

fstream file;file.open("1.txt", ios::in);if (file.is_open()) {string line;while (getline(file, line)) {cout << line << endl;}file.close();}

只读方式打开文件1.txt,如果该文件存在则会逐行打印文件内容

 1.txt文件内容:

运行结果:

写文件示例:

	fstream file;file.open("1.dat", ios::out | ios::trunc);if (file.is_open()) {file << "123";file << endl;file << "456";file << endl;file.close();}

以写文件的方式打开文件1.dat并且会先清空文件原有内容,执行后文件内容为:

Qt

Qt关于文件的打开、关闭、读取、写入操作将会用QFile、QTextStream、QDataStream,其中QFile负责文件的打开与关闭操作,QTextStream和QDataStream将以文本数据流和二进制数据流的方式读写文件。

打开文件:

    bool open(OpenMode flags) override;bool open(FILE *f, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle);bool open(int fd, OpenMode ioFlags, FileHandleFlags handleFlags=DontCloseHandle);​

也是需要指定文件的打开OpenMode,OpenMode有以下定义:

QIODevice::NotOpen

设备未打开

QIODevice::ReadOnly

只读形式打开

QIODevice::WriteOnly

写文件形式打开,文件不存在则会创建文件

QIODevice::ReadWrite

读写形式打开

QIODevice::Append

追加形式打开,写入内容将添加到文件尾

QIODevice::Truncate

截断形式打开,会清除文件原版内容

QIODevice::Text

文本形式打开,读取时,行结束符被翻译为'\n'。在写入时,行结束符被转换为本地编码,例如Win32中的'\r\n'

QIODevice::Unbuffered

无缓冲形式打开,设备中的任何缓冲区都被绕过

QIODevice::NewOnly

如果要打开的文件已经存在,则失败。仅在文件不存在时创建并打开该文件。操作系统保证您是唯一创建和打开文件的人。注意,此模式意味着WriteOnly,并且允许将其与ReadWrite结合使用。这个标志目前只影响QFile。其他类将来可能会使用此标志,但在此之前,对QFile以外的任何类使用此标志可能会导致未定义的行为(自Qt 5.11起)

QIODevice::ExistingOnly

如果要打开的文件不存在,则失败。此标志必须与ReadOnly, WriteOnly或ReadWrite一起指定。注意,单独对ReadOnly使用此标志是多余的,因为当文件不存在时,ReadOnly已经失败了。这个标志目前只影响QFile。其他类将来可能会使用此标志,但在此之前,对QFile以外的任何类使用此标志可能会导致未定义的行为(自Qt 5.11起)

这些也是可以使用“|”一起使用的。
关闭文件:

close()

QTextStream:

QTextStream以文本数据流的形式读写文件。

头文件:

#include <QTextStream>

读文件示例:

    QFile file("1.txt");if (file.open(QIODevice::ReadOnly)) {QTextStream in(&file);while (!in.atEnd()){qDebug()<<in.readLine();}file.close();}

以只读的形式打开1.txt文件,然后逐行打印文件内容。

写文件示例:

   QFile file("1.txt");    if (file.open(QIODevice::WriteOnly|QIODevice::Append)) {QTextStream out(&file);out<<"123aa";out<<endl;out<<"456aa";out<<endl;file.close();}

以写文件的形式打开,并且写入的内容会在文件末尾追加内容。
QDataStream:

QDataStream是以二进制数据流的形式进行文件的读写操作,用于将二进制数据到 QIODevice 的序列化。

头文件:

#include <QDataStream>

示例:

    QFile file("1.dat");if (file.open(QIODevice::WriteOnly|QIODevice::Truncate)) {QDataStream out(&file);out << QString("abc");out << (int)123;file.close();}

以写文件以及截断方式打开文件1.dat,依次写入字符串“abc”和int整形123,程序执行后用notepad++打开对应文件预览:

可以看到因为是二进制形式写入文件中所以是不支持预览的,但是用对应的QDataStream可以直接读取:

QFile file("1.dat");    
if (file.open(QIODevice::ReadOnly)) {QDataStream in(&file);int i;QString s;in>>s;in>>i;qDebug()<<i<<s;file.close();
}

运行结果:

将图片数据写入文件:

    QFile file("1.dat");QFile pic("1.png");if (file.open(QIODevice::WriteOnly|QIODevice::Truncate) && pic.open(QIODevice::ReadOnly)) {QDataStream out(&file);out << pic.fileName();out << pic.readAll();file.close();}

将图片文件1.png的文件名和文件数据写入到文件1.dat中 ,反正也可以读取对应图片数据生成对应图片文件:

    QFile file("1.dat");if (file.open(QIODevice::ReadOnly)) {QDataStream in(&file);QByteArray data;QString name;in>>name;in>>data;QPixmap pix;pix.loadFromData(data);pix.save(name);file.close();}

QDataStream读写自定义数据:

比如用DataStream实现自定义结构体数据的读写。

    struct MyStruct {int i;QString s;double d;friend QDataStream& operator <<(QDataStream &stream, const MyStruct &ms){stream<<ms.i<<ms.s<<ms.d;return stream;}friend QDataStream& operator >>(QDataStream &stream, MyStruct &ms){stream>>ms.i>>ms.s>>ms.d;return stream;}};

需要重载对应<<和>>操作符

    QFile file("1.dat");if (file.open(QIODevice::WriteOnly|QIODevice::Truncate)) {QDataStream out(&file);MyStruct my;my.i = 1;my.s = "a";my.d = 1.1;out<<my;file.close();}

读取:
 

    if (file.open(QIODevice::ReadOnly)) {QDataStream in(&file);MyStruct ms;in>>ms;qDebug()<<ms.i<<ms.s<<ms.d;file.close();}

运行效果:

 成功读取对应文件中的结构体数据。

相关文章:

C++/Qt 读写文件

之前写过两篇跟文件操作相关的博客&#xff0c;有兴趣也可以看一下&#xff1a; C语言读写文件 Qt关于文件路径的处理 先讲一些关于基础文本文件和二进制文件的读写操作&#xff0c;后续将会整理C/Qt关于ini、xml、json、xlsx相关文件的读写操作。 C 相比于C语言使用FILE文…...

linux服务器之-nethogs命令

文章目录 NetHogs 工具安装安装依赖包安装epel源安装Nethogs 使用 NetHogs 工具 NetHogs是一个小型的net top工具&#xff0c;不像大多数工具那样拖慢每个协议或者是每个子网的速度而是依照进程进行带宽分组。 安装 安装依赖包 yum install libpcap libpcap-devel epel-rel…...

《每天5分钟玩转kubernetes》读书笔记

笔记 概念 Pod是脆弱的&#xff0c;但应用是健壮的。 kubelet运行在Cluster所有节点上&#xff0c;负责启动Pod和容器。kubeadm用于初始化Cluster。kubectl是k8s命令行工具。通过kubectl可以部署和管理应用&#xff0c;查看各种资源&#xff0c;创建、删除和更新各种组件。 …...

【RabbitMQ】golang客户端教程4——路由(使用direct交换器)

路由 在上一教程中&#xff0c;我们构建了一个简单的日志记录系统。我们能够向许多接收者广播日志消息。 在本教程中&#xff0c;我们将向它添加一个特性-我们将使它能够只订阅消息的一个子集。例如&#xff0c;我们将只能将关键错误消息定向到日志文件&#xff08;以节省磁盘…...

Shell脚本学习-for循环结构2

案例&#xff1a;通过脚本实现仅sshd、rsyslog、crond、network、sysstat服务在开机时自启动。 Linux系统在开机的服务通常工作在文本模式3级别&#xff0c;因此只需要查找3级别以上的开启的服务即可。查看命令&#xff1a; chkconfig --list |grep 3:on [rootvm1 ~]# chkco…...

vue 老项目 npm install 报错Python,c++等相关错误

​​​ 老项目npm install 下载依赖包报错 解决方法&#xff1a; //下载python 1、 npm install --global --production windows-build-tools//配置环境 &#xff1a; 也可暂时不用配置,能用就不用配置&#xff08;npm config set python "D:\Python27\python.exe&q…...

【c语言初级】c++基础

文章目录 1. C关键字2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C输入&输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.2 C函数重载的原理--名字修饰采用C语言编译器编译后结果 1. C关键字 C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想…...

idea打开传统eclipse项目

打开传统web项目 1.打开后选择项目文件 2.选择项目结构 3.设置jdk版本 4.导入当前项目模块 5.选择eclipse 6. 设置保存目录 7.右键模块&#xff0c;添加spring和web文件 8. 设置web目录之类的&#xff0c;并且创建打包工具 9.如果有本地lib&#xff0c;添加为库 最后点击应用&…...

全国各城市-财政收入-一般预算收入-各项税收-个人所得税(1999-2020年)

个人所得税是一项反映国家财政状况和个人经济水平的重要数据。通过对全国各城市个人所得税数据的研究&#xff0c;可以提供研究者参考的有益信息。首先&#xff0c;个人所得税数据反映了不同城市居民的收入水平。通过对不同城市的个人所得税数据进行比较&#xff0c;可以了解不…...

【动态网页抓取】 :用Python抓取所有内容的指南

一、说明 您在抓取动态网页内容时是否得到了糟糕的结果&#xff1f;不仅仅是你。对于标准抓取工具来说&#xff0c;爬网动态数据是一项具有挑战性的任务&#xff08;至少可以说&#xff09;。这是因为当发出HTTP请求时&#xff0c;响应程序的某些部分JavaScript在后台运行&…...

Spring Boot数据访问基础知识与JDBC简单实现

目录 Spring Boot数据访问基础知识 Spring Data ORM JDBC JPA JDBC简单实现 步骤1&#xff1a;新建Maven项目&#xff0c;添加依赖 步骤2&#xff1a;配置数据源—让程序可以访问到 步骤3&#xff1a;配置数据源—让IDEA可以访问到 步骤4&#xff1a;添加数据库和表 …...

ubuntu添加万能头文件

ubuntu的C头文件目录为/usr/include 在/usr/include下新建文件夹 bits sudo mkdir bits进入bits&#xff0c;新建stdc.h&#xff0c;并修改权限为744/777 cd bits;sudo touch stdc.h;sudo chmod 777 stdc.h将以下内容粘贴到stdc.h&#xff0c;保存退出 // C includes used …...

聊一聊关于前端语法 ?? 的那些事

当我们在编写前端代码时&#xff0c;语法是非常重要的。正确的语法可以确保我们的代码能够正常运行&#xff0c;并且易于维护和理解。在本文中&#xff0c;我们将探讨一些前端语法的问题&#xff0c;例如空值合并运算符&#xff08;??&#xff09;。 空值合并运算符是ES2020…...

宝塔Linux面板升级“获取更新包失败”怎么解决?

宝塔Linux面板执行升级命令后失败&#xff0c;提示“获取更新包失败&#xff0c;请稍后更新或联系宝塔运维”如何解决&#xff1f;新手站长分享宝塔面板升级失败的解决方法&#xff1a; 宝塔面板升级失败解决方法 1、使用root账户登录到你的云服务器上&#xff0c;宝塔Linux面…...

训练强化学习的经验回放策略:experience replay

经验回放&#xff1a;Experience Replay&#xff08;训练DQN的一种策略&#xff09; 优点&#xff1a;可以重复利用离线经验数据&#xff1b;连续的经验具有相关性&#xff0c;经验回放可以在离线经验BUFFER随机抽样&#xff0c;减少相关性&#xff1b; 超参数&#xff1a;Rep…...

uniapp学习

1 简单的表单校验 <!--uniapp:参考模板和字段生成页面 字段stuNumber 输入框 学号stuName 输入框 学生姓名teacher 输入框 辅导员submitDate 日期选择 填报日期morningTemperature 输入框&#xff08;数字校验一位小数&#xff09; 早上体温noonTemperature 输入框&…...

机器学习深度学习——数值稳定性和模型化参数(详细数学推导)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——Dropout &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 这一部…...

layui 整合UEditor 百度编辑器

layui 整合UEditor 百度编辑器 第一步&#xff1a;下载百度编辑器并配置好路径 百度编辑器下载地址&#xff1a;http://fex.baidu.com/ueditor/ 第二步&#xff1a;引入百度编辑器 代码如下&#xff1a; <div class"layui-form-item layui-form-text"><…...

1、sparkStreaming概述

1、sparkStreaming概述 1.1 SparkStreaming是什么 它是一个可扩展&#xff0c;高吞吐具有容错性的流式计算框架 吞吐量&#xff1a;单位时间内成功传输数据的数量 之前我们接触的spark-core和spark-sql都是处理属于离线批处理任务&#xff0c;数据一般都是在固定位置上&…...

【Spring Boot】Spring Boot 集成 RocketMQ 实现简单的消息发送和消费

文章目录 前言基本概念消息和主题相关发送普通消息 发送顺序消息RocketMQTemplate的API介绍参考资料&#xff1a; 前言 本文主要有以下内容&#xff1a; 简单消息的发送顺序消息的发送RocketMQTemplate的API介绍 环境搭建&#xff1a; RocketMQ的安装教程&#xff1a;在官网…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...