cpp自学 day20(文件操作)

 基本概念

程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放

通过文件可以将数据持久化

C++中对文件操作需要包含头文件 <fstream>

文件类型分为两种:

  • 文本文件 - 文件以文本的ASCII码形式存储在计算机中
  • 二进制文件 - 文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们

操作文件的三大类:

        1. ofstream:写操作

        2. ifstream:读操作

        3. fstream:读写操作

#include <fstream>  // 必须包含的头文件
数据特性说明
程序运行时数据临时数据,程序结束即释放
文件持久化数据长期存储在磁盘中

文件打开模式

模式标志功能描述
ios::in为读取打开文件
ios::out为写入打开文件
ios::ate初始定位到文件末尾
ios::app追加写入模式
ios::trunc存在则清空重建
ios::binary二进制模式操作

文本文件

写文件

void test01() {// 1. 包含头文件(已在全局包含)// 2. 创建输出流对象ofstream ofs;// 3. 指定打开方式(组合模式用 | 连接)ofs.open("test.txt", ios::out | ios::trunc);// 4. 写入格式化数据ofs << "姓名:张三" << endl;  // 正确使用<<运算符ofs << "性别:男" << endl;ofs << "年龄:18" << endl;// 5. 关闭文件流ofs.close();
}

读文件

基础操作框架

#include <fstream>  // 必须包含的头文件
#include <string>   // 字符串操作支持void readFileDemo() {// 1. 创建流对象ifstream ifs;// 2. 打开文件并验证ifs.open("test.txt", ios::in);  // ios::in表示读取模式if (!ifs.is_open()) {           // 必须检查打开状态cerr << "文件打开失败" << endl;return;}// 3. 读取数据(四种方式见下文)// 4. 关闭文件流ifs.close();
}

四种读取方式对比

方式1:运算符重载读取
char buf[1024] = {0};  // 1024为缓冲区长度
while (ifs >> buf) {   // 自动处理空格/换行分隔cout << buf << endl;
}

特点:

  • 自动按空白符分割内容
  • 缓冲区需预分配固定大小
  • 适合结构化数据读取
方式2:getline成员函数
char buf[1024] = {0};
while (ifs.getline(buf, sizeof(buf))) {  // 流对象的成员函数cout << buf << endl;  // 自动处理换行符
}

特点:

  • 精确控制缓冲区大小
  • 自动去除换行符
  • 需注意缓冲区溢出风险
方式3:全局getline函数
string buf;
while (getline(ifs, buf)) {  // 使用string自动管理内存cout << buf << endl;     // 无长度限制
}

特点:

  • 自动管理内存
  • 无需担心缓冲区溢出
  • 标准推荐方式
方式4:逐字符读取
char c;
while ((c = ifs.get()) != EOF) {  // EOF检测cout << c;  // 原样输出所有字符
}

特点:

  • 完全控制读取过程
  • 适合二进制文件处理
  • 性能开销较大

二进制文件

核心操作框架

#include <fstream>
#include <string>// 示例数据结构
struct PlayerData {int id;         // 4字节double score;   // 8字节char name[32];  // 32字节
}; // 总大小:44字节void binaryDemo() {// 创建流对象fstream file("game.dat", ios::binary | ios::out | ios::in);// 验证文件状态if (!file.is_open()) {cerr << "文件打开失败" << endl;return;}// 读写操作(见下文示例)file.close();
}

读写文件

// 读取基本类型
int loadedScore;
file.read(reinterpret_cast<char*>(&loadedScore), sizeof(int));// 读取结构体(需内存对齐)
#pragma pack(push, 1)  // 1字节对齐
struct PackedData {short type;bool valid;// ...
};
#pragma pack(pop)PackedData data;
file.read(reinterpret_cast<char*>(&data), sizeof(PackedData));// 批量读取
vector<PlayerData> players(10);
file.read(reinterpret_cast<char*>(players.data()), players.size() * sizeof(PlayerData));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gartner发布软件供应链安全市场指南:软件供应链安全工具的8个强制功能、9个通用功能及全球29家供应商

攻击者的目标是由开源和商业软件依赖项、第三方 API 和 DevOps 工具链组成的软件供应链。软件工程领导者可以使用软件供应链安全工具来保护他们的软件免受这些攻击的连锁影响。 主要发现 越来越多的软件工程团队现在负责解决软件供应链安全 (SSCS) 需求。 软件工件、开发人员身…

备赛蓝桥杯-Python-考前突击

额&#xff0c;&#xff0c;离蓝桥杯开赛还有十个小时&#xff0c;最近因为考研复习节奏的问题&#xff0c;把蓝桥杯的优先级后置了&#xff0c;突然才想起来还有一个蓝桥杯呢。。 到目前为止python基本语法熟练了&#xff0c;再补充一些常用函数供明天考前再背背&#xff0c;算…

榕壹云外卖跑腿系统:基于Spring Boot+MySQL+UniApp的智慧生活服务平台

项目背景与需求分析 随着本地生活服务需求的爆发式增长&#xff0c;外卖、跑腿等即时配送服务成为现代都市的刚性需求。传统平台存在开发成本高、功能定制受限等问题&#xff0c;中小企业及创业团队极需一款轻量级、可快速部署且支持二次开发的外卖跑腿系统。榕壹云外卖跑腿系统…

使用Docker安装Gogs

1、拉取镜像 docker pull gogs/gogs 2、运行容器 # 创建/var/gogs目录 mkdir -p /var/gogs# 运行容器 # -d&#xff0c;后台运行 # -p&#xff0c;端口映射&#xff1a;(宿主机端口:容器端口)->(10022:22)和(10880:3000) # -v&#xff0c;数据卷映射&#xff1a;(宿主机目…

【antd + vue】Modal 对话框:修改弹窗标题样式、Modal.confirm自定义使用

一、标题样式 1、目标样式&#xff1a;修改弹窗标题样式 2、问题&#xff1a; 直接在对应css文件中修改样式不生效。 3、原因分析&#xff1a; 可能原因&#xff1a; 选择器权重不够&#xff0c;把在控制台找到的选择器直接复制下来&#xff0c;如果还不够就再加&#xff…

Streamlit在测试领域中的应用:构建自动化测试报告生成器

引言 Streamlit 在开发大模型AI测试工具方面具有显著的重要性&#xff0c;尤其是在简化开发流程、增强交互性以及促进快速迭代等方面。以下是几个关键点&#xff0c;说明了 Streamlit 对于构建大模型AI测试工具的重要性&#xff1a; 1. 快速原型设计和迭代 对于大模型AI测试…

docker 运行自定义化的服务-后端

docker 运行自定义化的服务-前端-CSDN博客 运行自定义化的后端服务 具体如下&#xff1a; ①打包后端项目&#xff0c;形成jar包 ②编写dockerfile文件&#xff0c;文件内容如下&#xff1a; # 使用官方 OpenJDK 镜像 FROM jdk8:1.8LABEL maintainer"ATB" version&…

解决java使用easyexcel填充模版后,高度不一致问题

自定义工具&#xff0c;可以通过获取上一行行高设置后面所以行的高度 package org.springblade.modules.api.utils;import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.wr…

repo仓库文件清理

1. repo 仓库内文件清理 # 清理所有Git仓库中的项目 repo forall -c git clean -dfx # 重置所有Git 仓库中的项目 repo forall -c git reset --hard 解释&#xff1a; repo forall -c git clean -dfx&#xff1a; repo forall 是一个用于在所有项目中执行命令的工具。-c 后…

结合大语言模型整理叙述并生成思维导图的思路

楔子 我比较喜欢长篇大论。这在代理律师界被视为一种禁忌。 我高中一年级的时候因为入学成绩好&#xff08;所在县榜眼名次&#xff09;&#xff0c;直接被所在班的班主任任命为班长。我其实不喜欢这个岗位。因为老师一来就要提前注意到&#xff0c;要及时喊“起立”、英语课…

spark-core编程2

Key-Value类型&#xff1a; foldByKey 当分区内计算规则和分区间计算规则相同时&#xff0c;aggregateByKey 就可以简化为 foldByKey combineByKey 最通用的对 key-value 型 rdd 进行聚集操作的聚集函数&#xff08;aggregation function&#xff09;。类似于aggregate()&…

原理图设计准备:页面栅格模板应用设置

一、页面大小的设置 &#xff08;1&#xff09;单页原理图页面设置 首先&#xff0c;选中需要更改页面尺寸的那一页原理图&#xff0c;鼠标右键&#xff0c;选择“Schmatic Page Properties”选项&#xff0c;进行页面大小设置。 &#xff08;2&#xff09;对整个原理图页面设…

关于异步消息队列的详细解析,涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结

以下是关于异步消息队列的详细解析&#xff0c;涵盖JMS模式对比、常用组件分析、Spring Boot集成示例及总结&#xff1a; 一、异步消息核心概念与JMS模式对比 1. 异步消息核心组件 组件作用生产者发送消息到消息代理&#xff08;如RabbitMQ、Kafka&#xff09;。消息代理中间…

【深度洞察】解码饮料行业破局点:场景革命

当东鹏特饮以 “大瓶装 防尘盖” 精准解决货车司机的场景化需求&#xff0c;当农夫山泉通过 “冷藏版东方树叶” 打开年轻白领的早餐场景 —— 这些现象级案例背后&#xff0c;是饮料行业底层逻辑的深刻变革&#xff1a;真正的市场增量&#xff0c;藏在对消费场景的极致拆解中…

二、TorchRec中的分片

TorchRec中的分片 文章目录 TorchRec中的分片前言一、Planner二、EmbeddingTable 的分片TorchRec 中所有可用的分片类型列表 三、使用 TorchRec 分片模块进行分布式训练TorchRec 在三个主要阶段处理此问题 四、DistributedModelParallel&#xff08;分布式模型并行&#xff09;…

如何在 Spring Boot 项目中使用 MyBatis 进行批量操作以提升性能?

MyBatis 提供了 ExecutorType.BATCH 类型&#xff0c;允许将多个 SQL 语句进行组合&#xff0c;最后统一执行&#xff0c;从而减少数据库的访问频率&#xff0c;提升性能。 以下是如何在 Spring Boot 项目中使用 MyBatis 进行批量操作的关键点&#xff1a; 1. 配置 MyBatis 使…

Redis 字符串(String)详解

1. 什么是字符串类型 在 Redis 中&#xff0c;字符串&#xff08;String&#xff09; 是最基本的数据类型。它可以包含任何数据&#xff0c;比如文本、JSON、甚至二进制数据&#xff08;如图片的 Base64 编码&#xff09;&#xff0c;最大长度为 512 MB。 字符串在 Redis 中不…

Elasticsearch 系列专题 - 第四篇:聚合分析

聚合(Aggregation)是 Elasticsearch 的强大功能之一,允许你对数据进行分组、统计和分析。本篇将从基础到高级逐步讲解聚合的使用,并结合实际案例展示其应用。 1. 聚合基础 1.1 什么是聚合(Aggregation)? 聚合是对文档集合的统计分析,类似于 SQL 中的 GROUP BY 和聚合…

YOLO学习笔记 | YOLOv8 全流程训练步骤详解(2025年4月更新)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 这里写自定义目录标题 一、数据准备1. 数据标注与格式转换2. 配置文件生…

context上下文(一)

创建一个基础的context 使用BackGround函数&#xff0c;BackGround函数原型如下&#xff1a; func Background() Context {return backgroundCtx{} } 作用&#xff1a;Background 函数用于创建一个空的 context.Context 对象。 context.Background() 函数用于获取一个空的 cont…