C++系列-文件操作
文件操作
- 文件类型
- 文本文件
- 二进制文件
- 文件操作的三大类
- 文件的打开方式
- ios::app(append)和 ios::ate(at end)
- 写文件
- 写文件文件步骤
- 读文件文件步骤
- 二进制文件读写
- 写一般数据
- 写特殊数据
- 程序运行时产生的数据都属于临时数据,一旦程序运行完毕,就会释放,要想保存,可以通过将其写入文件。
- 同时,程序中使用的一些数据也可以通过读文件的方式应用于程序中。
文件类型
- 文件的读写方式有两种,文本文件和二进制文件。
- 计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。
文本文件
- 文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。
二进制文件
- 二进制文件有特定的编码方式,用户一般不能直接读懂。
- 二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码。
- 二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。大家可能对BMP文件比较熟悉,就拿它举例子吧,其头部是较为固定长度的文件头信息,前2字节用来记录文件为BMP格式,接下来的8个字节用来记录文件长度,再接下来的4字节用来记录bmp文件头的长度。
文件操作的三大类
需要包含头文件,fstream, f:file
- ofstream, o: out, 代码往外吐数据,即写到文件去。
- ifstream, i: in, 入向代码,从文件读到代码中。
- fstream,in,out均包括。
文件的打开方式
打开方式 | 适用对象 | 说明 |
---|---|---|
ios::in | ifstream,fstream | 打开文件用于读取数据,如果文件不存在,则打开出错 |
ios::out | ofstream,fstream | 打开文件用于写入数据。如果文件不存在,则新建该文件;如果文件原来就存在,则打开时清除原来的内容 |
ios::app | ofstream,fstream | 打开文件,用于在其尾部添加数据。如果文件不存在,则新建该文件,每次的写入操作都会在后面追加 |
ios::ate | ofstream,fstream | 打开一个已有的文件,并将文件指针指向文件末尾。如果文件不存在,则打开出错 |
ios:: trunc | ofstream | 打开文件时会清空内部存储的所有数据,相当于先删除原有文件,再重新建立一个文件 |
ios::binary | ifstream,ofstream,fstream | 以二进制方式打开文件。若不指定此模式,则以文本模式打开 |
ios::in | ios::out | ios::trunc | fstream | 打开文件,既可读取其内容,也可向其写入数据。如果文件本来就存在,则打开时清除原来的内容;如果文件不存在,则新建该文件 |
ios::app(append)和 ios::ate(at end)
-
每个文件都有一个位置指针,指向将要读写的下一个字节,打开文件时,默认的位置指针指向文件的开始;打开方式ate(表示at-end)和app(表示追加)能将位置指针定位到文件尾。
-
如果以追加方式打开文件,所有向文件的输出从当前文件的尾部开始进行,不必重新定位。即使你修改文件位置指针不指向文件尾部,也不会将输出写到那里。
以at-end方式打开文件时,文件起始位置指向文件尾部,但你可以修改位置指针指向其它位置,输出则写到指针指向的位置。 -
在实际应用中,如果需要在多个线程或进程间安全地追加数据到文件中,而不希望数据被覆盖或混淆,那么ios::app模式是最佳选择。
-
而如果需要在打开文件时就确定写指针的位置,或者需要清空文件内容然后重新写入,那么使用ios::ate模式可能更为合适, 然而,值得注意的是,如果只使用ios::ate模式而不配合ios::in或ios::out模式,将会清空原文件的内容。
-
当使用ios::app模式时,如果打开的文件不存在,系统将自动创建该文件。
-
而当使用ios::ate模式时,如果打开的文件不存在,系统将无法打开文件,报错。
写文件
写文件文件步骤
- 包含头文件, #include <fstream>
- 创建流对象,通过流对象,可以与文件打交道,ofstream ofs
- 打开文件,参数有文件的路径,打开方式等,ofs.open(文件路径,打开方式), 也可以创建流对象和打开合并为一个ofstream ofs(文件路径,打开方式)
- 向文件写入内容 ofs << 写入的数据
- 关闭文件, ofs.close()
读文件文件步骤
- 包含头文件, #include <fstream>
- 创建流对象,通过流对象,可以与文件打交道,ifstream ofs
- 打开文件,参数有文件的路径,打开方式等,ofs.open(文件路径,打开方式), 也可以创建流对象和打开合并为一个ifstream ifs(文件路径,打开方式)
- 从文件读取内容
– 方法1,创建字符数组接收读取文件的内容,使用ifs >> 字符数组,while (ifs >> buf)
– 方法2,创建字符数组接收读取文件的内容,使用ifs.getline(字符数组,sizeof(字符数组)),(ifs.getline(buf, sizeof(buf)))
– 方法3,创建字符串接收读取文件的内容,使用string的全局函数getline(流对象,字符串变量),while (getline(ifs, buf))
– 方法4,创建字符接收读取文件的内容,使用ifs.get(),while(char_data = ifs.get())!=EOF) - 关闭文件, ofs.close()
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
void main()
{ofstream ofs("d:/student.txt", ios::ate); // 创建流对象,并打开ofs << "张三,10" << endl << "李四,20" << endl << "王五,30" << endl; // 写入文件ofs.close();ifstream ifs("d:/student.txt", ios::in); // 创建流对象,写读取方式打开文件if (!ifs.is_open()) // 判断文件是否打开成功return;// 方法1,使用ifs >> buf的方式,用字符数组来接收文件中的数据//char buf[100] = { 0 }; // 创建字符数组用于存放读取的数据 //while (ifs >> buf) // ifs >> buf, 将文件中的数据依次放入buf中,当读完后,此条件不满足//{// cout << buf << endl;//}// 方法2,使用流对象的方法getline(char* 接收数据的字符数组的地址,sizeof(要接收数据的字符数组))//char buf[100] = { 0 }; // 创建字符数组,用于存放读取的数据 //while (ifs.getline(buf, sizeof(buf))) // 使用对象方法getline将文件中的数据放入buf中,当读完后,此条件不满足//{// cout << buf << endl;//}//ifs.close();//system("pause");// 方法3,使用全局函数getline//string buf;//while (getline(ifs, buf)) // 使用全局方法getline(输入流对象,接收数据的字符串)#include <string>需要包含,将文件中的数据放入buf中,当读完后,此条件不满足//{// cout << buf << endl;//}// 方法4,逐个字符读取, 这种方式的效率比较低char char_data;while ((char_data = ifs.get())!=EOF) // EOF: end of files{cout << char_data;}
}
二进制文件读写
写一般数据
#include <fstream> // 包含头文件
#include <iostream>
using namespace std;void main()
{char str1[30] = "张三,10\n李四,20";char str2[30] = {0};ofstream ofs("d:/person.txt", ios::out | ios::binary); // 创建输出流对象,打开文件,二进制写入方式ios::binaryif (!ofs){cout << "创建文件失败" << endl;return;}ofs.write((const char*)str1, sizeof(str1)); //write以char *的方式进行写出,做一个转化,write(要写入的数据地址,数据长度)ofs.close(); // 关闭文件ifstream ifs("d:/person.txt", ios::in | ios::binary);if (!ifs){cout << "读取文件失败" << endl;return;}ifs.read((char*)str2, sizeof(str2)); // read(char* 读取数据的接收地址,接收数据的字符数组长度)cout << str2 << endl;ifs.close(); // 关闭文件system("pause");
}
写特殊数据
#include <fstream>
#include <iostream>
using namespace std;
class Person
{
public:Person(string name, int age) : m_name(name), m_age(age) {} // 初始化列表string m_name;int m_age;
};
void main()
{Person p1("张三", 10);Person p2("1", 0);ofstream ofs("d:/person.txt", ios::out | ios::binary);ofs.write((const char*)&p1, sizeof(p1));ofs.close();ifstream ifs("d:/person.txt", ios::in | ios::binary);ifs.read((char*)&p2, sizeof(p2));if (!ifs){cout << "读取文件失败" << endl;return;}cout << p2.m_name << ", " << p2.m_age << endl;ifs.close();system("pause");
}
相关文章:
C++系列-文件操作
文件操作 文件类型文本文件二进制文件 文件操作的三大类文件的打开方式ios::app(append)和 ios::ate(at end) 写文件写文件文件步骤读文件文件步骤二进制文件读写写一般数据写特殊数据 程序运行时产生的数据都属于临时数据,一旦程序运行完毕,就会释放&am…...

ES6解构赋值详解;全面掌握:JavaScript解构赋值的终极指南
目录 全面掌握:JavaScript解构赋值的终极指南 一、数组解构赋值 1、基本用法 2、跳过元素 3、剩余元素 4、默认值 二、对象解构赋值 1、基本用法 2、变量重命名 3、默认值 4、嵌套解构 三、复杂的嵌套结构解构 四、函数参数解构赋值 1、对象解构作为函…...

2-73 基于matlab的weber能量法求解齿轮时变啮合刚度的程序
基于matlab的weber能量法求解齿轮时变啮合刚度的程序,能够跑出刚度图,通过求解轮齿部分变形、基体变形及局部接触变形这三部分的变形,进而求得综合弹性变形,最终求出时变啮合刚度。程序已调通,可直接运行。 2- 73 齿轮…...

[C++]set和map的介绍及使用
关于set和map的接口函数部分,只重点介绍一些相较于别的容器有特殊地方的接口,set和map的接口可以触类旁通。 一、概念 (一)、关联式容器 关联式容器存储的元素是一个个的键值对<key,value>。通过键(key&#x…...
【MySQL】MySQL学习笔记(持续更新)
1. 安装MySQL(windows环境) (1)在http://www.mysql.com下载*.msi的安装文件,并运行安装: 如:mysql-installer-community-8.0.39.0.msi 全部安装包含如下内容: …...

ArcGIS如何将投影坐标系转回为地理坐标系
有时候两个数据,一个为投影坐标系,另一个为地理坐标系时,在GIS软件中位置无法叠加到一起,这需要将两个或多个数据的坐标系统一,可以直接将地理坐标系的数据进行投影,或将投影坐标系转为地理坐标系。下面介绍…...

Parallels Desktop 19 for Mac 安装虚拟机需要激活吗
Parallels Desktop 19 for Mac 乃是一款适配于 Mac 的虚拟化软件。它能让您在 Mac 计算机上同时运行多个操作系统。您可借此创建虚拟机,并于其中装设不同的操作系统,如 Windows、Linux 或 macOS。使用 Parallels Desktop 19 mac 版时,您可在 …...

wps题注为表格或图片编号
word中为表格添加题注: 问题:多次或多人编辑导致--序号不能联动更新(域代码不一致,如图) 所以是否可以批量替换word里的域代码?如果可以这问题就解决了————失败 解决办法: 如图,复制表头&…...

集成测试怎么做?
任何产品想要长期保持高质量运行,集成测试正是实现这一目标必不可少的工具。 本文重点介绍集成测试实现的流程,而非测试工具本身。我们的目的是聚焦于创建测试过程中你可能遇到的问题,以便你能自主地推进工作。 缺陷的成本 细节决定成败&a…...
java mybatis 使用work id
在 MyBatis-Plus 中,如果你想要使用 WORK_ID 作为 ID 生成策略的一部分,通常是指使用雪花算法(Snowflake Algorithm)的一种变体来生成全局唯一 ID。雪花算法能够生成一个递增的 64 位整数作为 ID,这种 ID 在分布式系统…...
MySQL 的子查询(Subquery)
在数据库查询中,有时候我们需要从一个查询的结果集中获取数据,再将这些数据作为另一个查询的一部分来使用。MySQL 提供了子查询(Subquery)这一强大工具,帮助我们实现嵌套查询,从而解决复杂的数据检索需求。…...

后端Web之数据库(以MySQL为例)
目录 1.概述 2.MySQL 3.DDL 4.DML 5.DQL 1.概述 对于我们自己写的一些小功能,数据一般存储在文件中,比如XML文件。而在实际项目中,数据都是存放在数据库中的。数据库(DataBase )是一个存储数据的集合,…...

委托发布 | 进迭时空联合移动云能力中心实现业界首个RISC-V IO虚拟化方案
仟江水商业电讯(8月22日 北京 委托发布)虚拟化是云计算技术基石,是RISC-V走进云计算等高性能计算场景的必然要求。RISC-V国际基金会2021年制定了Hypervisor 1.0规范,2023年制定了AIA 1.0规范和IOMMU 1.0规范,这3个规范…...
3-Electron打开新窗口,并跳转到指定的路由
需要配置路由。src/router/index.js {path: "/selectMode",name: "selectMode",component: () > import("//view/selectMode/index.vue"),},src/**.vue import { ipcRenderer } from "electron";const openNewTab () > {let p…...
comfyUI和SD webUI都有哪些差别呢?
ComfyUI和SD WebUI都是用于AI绘画的用户界面,它们各自有着不同的特点和适用场景。以下是两者之间的一些关键差别: 1、用户体验与界面友好性: SD WebUI(Stable Diffusion Web User Interface)以其直观易用著称,特别受初…...
MySql中常用的sql语句大全(工作常用篇)
1. DDL 1.1 操作数据库 --创建库 create database 库名;--创建库时判断库是否存在,不存在则创建 create database if no exists 库名;--查看所有数据库 show databases;--使用指定数据库 use 库名;--查看当前指定数据库包含的数据表 show tables;--查看数据库的结…...
React+Vis.js(03):vis.js设置节点形状
文章目录 Vis支持的形状类型代码实现完整代码实现效果Vis支持的形状类型 circle(圆形)box(盒子)dot(点)star(五角星)triangle(三角形)ellipse(椭圆形)triangleDown(倒三角形)diamond(菱形)代码实现 通过shape属性来定义每个节点的形状 const nodes = new vis…...
Pod和Deployment
一、pod Evicted状态: 在Kubernetes中,当节点资源紧张时,Kubelet可能会驱逐节点上的一些Pods以释放资源。当这种情况发生时,Pod的状态会被设置为"Evicted"。 1.pod的探针 1.就绪性探针: 一般用于探测容器…...
7. 数据结构—二叉树(链式存储)
1. 内容 包括链式存储二叉树的 递归与非递归实现的先序、中序以及后序遍历、层序遍历、创建二叉树、计算深度、总节点数。 2. 实现代码 注意:只是伪代码,如果想要运行的话在细节方面需要自己修正,栈和队列的方法实现需要引进或者使用其C自…...

AScript 的UI asui模板的导入
两种方案: 第一种直接在web端,右击UI文件夹 第二种在pycharm,也是右击UI文件夹 调用UI,在init类中直接调用即可...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...