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程序…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...