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程序…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...