Day 19 C++ 文件操作
C++ 文件操作
- 文件
- 为什么要使用文件
- 文件类型
- 文本文件 - 文件以文本的ASCII码形式存储在计算机中
- 二进制文件 - 文件以文本的二进制形式存储在计算机中
- 操作类型
- ofstream:写操作
- ifstream: 读操作
- fstream : 读写操作
- 文本文件
- 写文件
- 引入头文件 \<fstream>
- 创建一个输出文件流对象 ofstream
- 打开文件,并指定文件路径和打开方式,可以使用 open() 成员函数。
- 文件路径可以指定文件的**相对路径或绝对路径**。
- 打开方式
- 写入数据
- 关闭文件。可以使用流的 close() 成员函数来关闭文件。
- 示例
- 注意
- 读文件
- 引入头文件 \<fstream>。
- 创建一个输入文件流对象 ifstream
- 打开文件,并判断文件是否成功打开。
- 读取数据(4种)
- 关闭文件。可以使用流的 close() 成员函数来关闭文件。
- 示例
- 二进制文件
- 写入文件
- 函数原型
- 函数参数
- 示例
- 读文件
- 函数原型
- 函数参数(同写入一致)
- 示例
- 输入输出
- 输出(output)
- 输入(input)
文件
为什么要使用文件
程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被没了
通过文件可以将数据持久化
文件类型
文本文件 - 文件以文本的ASCII码形式存储在计算机中
它们包含了可读的字符数据,可以使用文本编辑器等工具直接打开查看和编辑。文本文件通常用于存储普通文本信息,如代码文件、配置文件、日志文件等。常见的文本文件扩展名有
.txt、.cpp、.h、.html 等。
二进制文件 - 文件以文本的二进制形式存储在计算机中
其中的数据是以二进制编码表示的。与文本文件不同,二进制文件中的数据不一定是可读的字符数据,用户一般不能直接读懂它们。二进制文件用于存储各种非文本类型的数据,如图像、音频、视频、数据库文件等。常见的二进制文件扩展名有
.jpg、.mp3、.avi、.dat 等。
操作类型
C++中对文件操作需要包含头文件 fstream
#include <fstream>
ofstream:写操作
这个类用于写操作,即将数据写入文件。你可以使用该类的对象创建或打开一个文件,并将数据写入文件。例如,你可以使用<<运算符将数据写入文件。
ifstream: 读操作
这个类用于读操作,即从文件中读取数据。你可以使用该类的对象打开一个已存在的文件,并从文件中读取数据。例如,你可以使用>>运算符从文件中读取数据。
fstream : 读写操作
这个类用于读写操作,既可以读取文件,也可以将数据写入文件。你可以使用该类的对象打开一个文件,然后通过读取和写入操作对文件进行处理。
这些类都是通过包含 头文件来使用的,该头文件提供了与文件输入输出相关的函数和类。
文本文件
写文件
引入头文件 <fstream>
首先,需要包含头文件 <fstream>,以便使用文件操作相关的类和函数。
#include <fstream>
创建一个输出文件流对象 ofstream
给它取一个合适的名字,比如 ofs。
ofstream ofs;
写文件可以利用 ofstream ,或者fstream类
打开文件,并指定文件路径和打开方式,可以使用 open() 成员函数。
ofs.open("文件路径", 打开方式);
文件路径可以指定文件的相对路径或绝对路径。
打开方式
ios::out:打开文件用于写入操作,若文件不存在则创建新文件,若文件已存在则清空原有内容。
ios::app:打开文件用于写入操作,在文件末尾追加写入数据,如果文件不存在,则创建新文件。
ios::ate:打开文件用于写入操作,将写指针定位到文件末尾,保留原有内容。
ios::trunc:打开文件用于写入操作,若文件已存在则清空原有内容,若文件不存在则创建新文件(默认行为)。

注意: 文件打开方式可以配合使用,利用|操作符
例如:用二进制方式写文件 ios::binary | ios:: out**
写入数据
你可以使用 << 运算符将需要写入的数据插入到文件流对象中。
ofs << "写入的数据";
在这里,你可以写入任何你想要写入的数据,比如字符串、数字等。
关闭文件。可以使用流的 close() 成员函数来关闭文件。
ofs.close();
关闭文件是一个很重要的步骤,它会确保所有的数据都被完整地写入到文件中,并释放资源。
示例
#include <iostream>
#include <fstream>int main() {std::ofstream ofs;ofs.open("example.txt", std::ios::out);if (ofs.is_open()) {ofs << "Hello, World!";ofs.close();std::cout << "文件写入成功!" << std::endl;} else {std::cout << "无法打开文件。" << std::endl;}return 0;
}
在上述示例中,我们首先创建了一个 ofstream 对象 ofs,然后调用 open() 函数打开了一个名为 “example.txt” 的文件,打开方式为输出模式。接下来,使用 << 运算符将字符串 “Hello, World!” 插入到 ofs
对象中,相当于将这个字符串写入到文件中。最后,调用 close() 函数关闭文件。
注意
- 文件操作必须包含头文件 fstream
- 写文件可以利用 ofstream ,或者fstream类
- 打开文件时候需要指定操作文件的路径,以及打开方式
- 利用<<可以向文件中写数据
- 操作完毕,要关闭文件
可以使用输出操作符(如<<)将数据写入文件,也可以使用成员函数(如write())进行更底层的写入操作。在完成文件写入后,建议调用 close() 方法关闭文件流。
需要注意的是,如果文件已经存在并且以 "ios::out" 模式打开文件,那么会清空文件内容并将新的内容写入文件。如果想要在已有文件的末尾追加内容,可以使用 "ios::app" 模式来打开文件。
读文件
引入头文件 <fstream>。
#include <fstream>
创建一个输入文件流对象 ifstream
ifstream ifs;
打开文件,并判断文件是否成功打开。
可以使用 open() 成员函数来打开文件,并通过 is_open() 成员函数检查文件是否成功打开。
ifs.open("文件路径", 打开方式);
if (ifs.is_open()) {// 文件成功打开
} else {// 文件打开失败
}
文件路径和打开方式同写入操作的要求一致
注意,文件必须存在且可读才能成功打开。
读取数据(4种)
-
使用输入流对象 >> 运算符读取数据
-
使用 getline() 函数逐行读取字符串数据
这种方式可以一次读取文件中的一行内容,存储在一个字符串变量中。
- 使用 get() 函数逐个字符地读取数据
这种方式可以逐个字符地读取文件中的数据。
- 使用 read() 函数读取指定数量的字节数据
这种方式可以读取指定数量的字节
关闭文件。可以使用流的 close() 成员函数来关闭文件。
ofs.close();
关闭文件是一个很重要的步骤,它会释放资源并确保文件操作的完整性。
示例
#include <iostream>
#include <fstream>
#include <string>int main() {std::ifstream ifs;ifs.open("example.txt", std::ios::in);if (ifs.is_open()) {// 逐行读取字符串数据std::string line;while (std::getline(ifs, line)) {std::cout << line << std::endl;}// 读取整数数据int num;ifs >> num;std::cout << "读取到的整数是:" << num << std::endl;ifs.close();std::cout << "文件读取成功!" << std::endl;} else {std::cout << "无法打开文件。" << std::endl;}return 0;
}
在上述示例中,我们首先创建了一个 ifstream 对象 ifs,然后调用 open() 函数打开了一个名为 “example.txt” 的文件,打开方式为输入模式。接下来,使用 getline() 函数逐行读取文件中的字符串数据,并输出到标准输出流。然后,使用 >>
运算符将文件中的整数读取到变量 num 中,并输出。最后,调用 close() 函数关闭文件。
二进制文件
以二进制的方式对文件进行读写操作
打开方式要指定为 ios::binary
写入文件
使用二进制方式写入文件时,可以使用流对象的成员函数 write() 进行操作。
函数原型
ostream& write(const char* buffer, int len);
函数参数
buffer 是一个指向内存中一段存储空间的字符指针。在写入文件时,将从这段内存空间中读取数据。
len 是要读写的字节数,即从 buffer 中读取的数据长度。
可以通过调用 write() 函数多次连续写入更多数据。
注意,该函数返回流对象的引用,可以方便地进行链式操作。
示例
#include <iostream>
#include <fstream>int main() {std::ofstream ofs;ofs.open("example.bin", std::ios::binary);if (ofs.is_open()) {int num = 42;ofs.write(reinterpret_cast<const char*>(&num), sizeof(num));float pi = 3.14f;ofs.write(reinterpret_cast<const char*>(&pi), sizeof(pi));ofs.close();std::cout << "二进制文件写入成功!" << std::endl;} else {std::cout << "无法打开文件。" << std::endl;}return 0;
}
在上述示例中,我们创建了一个 ofstream 对象 ofs,然后调用 open() 函数打开名为 "example.bin"的文件,并以二进制方式进行操作。接下来,使用 write() 函数以二进制形式连续写入一个整数和一个浮点数到文件中。注意,我们使用reinterpret_cast 进行类型转换,将指向这些数据的指针转换为 const char* 类型,以便与 write() 函数的参数类型匹配。最后,调用 close() 函数关闭文件。
读文件
使用二进制方式读取文件时,可以使用流对象的成员函数 read() 进行操作。
函数原型
istream& read(char* buffer, int len);
函数参数(同写入一致)
buffer 是一个指向内存中一段存储空间的字符指针。读取的数据将被写入到这段内存空间中。
len 是要读取的字节数,即从文件中读取的数据长度。
可以通过调用 read() 函数多次连续读取更多的数据。
注意,该函数返回流对象的引用,可以方便地进行链式操作。
示例
#include <iostream>
#include <fstream>int main() {std::ifstream ifs;ifs.open("example.bin", std::ios::binary);if (ifs.is_open()) {int num;ifs.read(reinterpret_cast<char*>(&num), sizeof(num));std::cout << "读取到的整数是:" << num << std::endl;float pi;ifs.read(reinterpret_cast<char*>(&pi), sizeof(pi));std::cout << "读取到的浮点数是:" << pi << std::endl;ifs.close();std::cout << "二进制文件读取成功!" << std::endl;} else {std::cout << "无法打开文件。" << std::endl;}return 0;
}
在上述示例中,我们创建了一个 ifstream 对象 ifs,然后调用 open() 函数打开名为 “example.bin” 的文件,并以二进制方式进行操作。接下来,使用 read() 函数连续读取一个整数和一个浮点数的数据,并将其存储到相应的变量中。注意,我们使用 reinterpret_cast 进行类型转换,将指向这些数据的指针转换为 char* 类型,以便与 read()函数的参数类型匹配。最后,将读取到的整数和浮点数输出到标准输出流。最后,调用 close() 函数关闭文件。
输入输出
输出(output)
于文件操作,写入被称为输出(output),因为数据是从程序流向文件的。在C++中,文件输出被视为将数据从程序输出到文件。
因此,在C++中,我们使用输出流(output stream)来表示用于向文件写入数据的对象。这些输出流类(如 ofstream 和 fstream)提供了方便的接口和方法,使我们能够轻松地将数据写入文件。
输出流的特点是数据从程序输出到文件,而输入流(input stream)则是数据从文件输入到程序。这种命名方式是为了与输入相对应,以更好地描述数据的流动方向。
总结一下,写入操作使用输出流来表示,是因为数据是从程序输出到文件的过程,而不是从文件输入到程序。
输入(input)
对于文件操作,读取被称为输入(input),因为数据是从文件流向程序的。在C++中,文件读取被视为将数据从文件输入到程序。
因此,在C++中,我们使用输入流(input stream)来表示用于从文件读取数据的对象。这些输入流类(如 ifstream 和 fstream)提供了方便的接口和方法,使我们能够轻松地从文件中读取数据。
输入流的特点是数据从文件输入到程序,而输出流(output stream)则是数据从程序输出到文件。这种命名方式是为了更好地描述数据的流动方向。
总结一下,读取操作使用输入流来表示,因为数据是从文件输入到程序的过程,而不是从程序输出到文件。
相关文章:
Day 19 C++ 文件操作
C 文件操作 文件为什么要使用文件文件类型文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本的二进制形式存储在计算机中 操作类型ofstream:写操作ifstream: 读操作fstream : 读写操作 文本文件写文件引入头文件 \&l…...
Nginx源码安装
文章目录 Nginx源码安装注安装pcre库安装openssl库创建用户及用户组安装编译环境解压文件检测环境重要目录检查配置服务启动脚本查看效果: Nginx源码安装 注 本实验基于RHEL73.10.0-327.el7.x86_64,尽量使用RHEL7或CentOS7。 安装pcre库 安装 pere 库…...
【数据结构和算法】--N叉树返回根节点到目标节点的路径
目录 一、前言二、Java代码实现 一、前言 项目中接触一个问题:在大量有父子关系的列表中,需要筛选出特定约束的数据【要求某个目标节点延续到根节点的数据】。这个问题抽象为数据结构,就是:N叉树返回根节点到目标节点的路径 二、…...
Flutter环境搭建踩坑集锦
Flutter 背景准备工作先检查一下自己的电脑,看一下是不是满足配置要求下载安装配置环境下载安装JDK下载安装Android studio下载Flutterflutter doctor故障Android license status unknownNetwork resources 故障 后记 背景 发现一个不错的框架Flutter,听…...
WPF上位机7——MySql
MySql DML语句 db操作、表操作 字段的数据类型 修改表 表的数据操作 DQL语句 数据查询和去重查询 条件查询 模糊查询 聚合查询 分组查询 排序查询 分页查询 DCL语句 函数 字符串处理函数 数值函数 日期函数 流程函数 约束 外键约束 多表查询 内连接 外连接 自连接 子查询 列…...
Linux的基本指令(2)
指令1:man 作用:可以查询linux指令语法内容。 格式: man 指令 安装man指令: yum install -y man-pages 例如: 查询 指令 ls 的语法内容。 man ls 查询 fork 指令的语法内容。 man fork 在man中存在9个手册&…...
mySql-Linux-安装
mySql-Linux-通过YUM安装 下载 yum 源 [rootspark ~]# wget http://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm --2023-07-31 22:51:21-- http://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm 正在解析主机 repo.mysql.com (repo.mysql.com…...
JS实现IOS标准时间(JSON时间格式)格式转yyyy-mm-dd格式
JS实现IOS时间格式转yyyy-mm-dd格式 /*** IOS时间格式转yyyy-mm-dd格式*param iosDate [IOS时间格式]*return {string} [yyyy-mm-dd]**/ const convertIOSDateFormat (iosDate) > {if(!iosDate) {return -;}const date new Date(iosDate);const year date.getFullYear()…...
【Jmeter】 Report Dashboard 生成html图形测试报告
目录 背景 生成图形报告的方式 1、直接使用一个已存在的 CSV文件生成 2、负载测试完成后自动生成 使用示例 报告内容详情 测试报告摘要图 响应时间随时间变化曲线 活跃线程随时间变化曲线 I/O(Bytes)随时间变化曲线(忽略事务控制器示例结果) …...
7种有效安全的网页抓取方法,如何避免被禁止?
网页抓取是一种从互联网上抓取网页内容的过程,但在网络抓取种相信您也经常遇到障碍?尤其是做跨境业务的,在抓取国外的网站时更有难度。但我们站在您的立场上,提供七种有效的方法来进行网页抓取而不被阻止,最大限度地降…...
flask服务生成证书文件,采用https访问,开启用户密码验证
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 3072开启用户密码验证 auth.verify_password def verify_password(username, password):if username abcdefg and password 1234546:return usernameapp.route(/post_request, methods[POST…...
上海首个“零工”就业云平台上线
1.背景 今年6月,黄浦区人社局在建立新业态新职业岗位信息发布机制,挖掘数字经济、电商微商、兼职、共享、远程等新业态岗位的基础上,和人力资源机构携手打造全市首个“新经济、新业态”零工就业云平台。 2. 平台简介 平台上汇聚了新生代互…...
面试必考精华版Leetcode104. 二叉树的最大深度
题目: 代码(首刷自解 day23): class Solution { public:int maxDepth(TreeNode* root) {if(rootnullptr) return 0;return max(maxDepth(root->left),maxDepth(root->right))1;} };...
winform panel中放置 usercontrol ,设置usercontrol随着dpi分辨率变化
在 WinForms 中,如果要使 UserControl 随着 DPI 分辨率的变化而自适应调整大小,可以遵循以下步骤: 使用 Anchor 和 Dock 属性:在 UserControl 中的控件布局时,使用 Anchor 和 Dock 属性来适应父控件的大小变化。 处理…...
更新页面无法回显
需求与问题: 在菜品管理开发中,我需要修改菜品,第一步是回显页面,但在我再三确认代码无误的情况下依旧无法回显内容 问题发现与解决: 经过排查,我发现我的DishDTO内容如下: Data public clas…...
CS 144 Lab Four -- the TCP connection
CS 144 Lab Four -- the TCP connection TCPConnection 简述TCP 状态图代码实现完整流程追踪 测试 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab Three 对应的PDF: Lab Checkpoint 4: down the stack (the network interface) TCPConnection 简述 TCPConnection 需…...
在Volo.Abp微服务中使用SignalR
假设需要通过SignalR发送消息通知,并在前端接收消息通知的功能 创建SignalR服务 在项目中引用 abp add-package Volo.Abp.AspNetCore.SignalR在Module文件中添加对模块依赖 [DependsOn(...typeof(AbpAspNetCoreSignalRModule))] public class IdentityApplicati…...
数据可视化(七)常用图表的绘制
1. #seaborn绘制常用图表 #折线图 #replot(x,y,kind,data) #lineplot(x,y,data) #直方图 #displot(data,rug) #条形图 #barplot&…...
【ARM 常见汇编指令学习 8 - dsb sy 指令及 dsb 参数介绍】
文章目录 ARM dsb sy 指令 上篇文章:ARM 常见汇编指令学习 7 - LDR 指令与LDR伪指令及 mov指令 下篇文章:ARM 常见汇编指令学习 9 - 缓存管理指令 DC 与 IC ARM dsb sy 指令 数据同步屏障是一种特殊类型的内存屏障。 只有当DSB指令执行完毕后ÿ…...
YOLOv5本地模型训练报错解决
报错解决 页面文件太小,无法完成操作 训练过程中,发生下图所示的报错,同时pycharm崩溃 1. 更改虚拟内存 进入高级系统设置,应该都会进,就不说过程了 设置虚拟内存大小 2. 减小占用内容大小 新建一个fixNvPe.py程序…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
