【C++】文件
目录
- 文件
 - 文件分类
 - 文本文件的读写(ASCII文件)的读写
 - 打开文件
 - 打开文件的方式
 - 关闭文件
 - 将数据写入ASCII文件
 - 从ASCII文件读入数据
 
- 二进制存储
 - 对比ASCII和二进制存储
 - 用成员函数read和write读写二进制文件
 - 打开方式
 - 文件的读入与读出
 
文件
- 所谓文件,一般指存储在外部介质上数据的集合。
 - 一批数据是以文件的形式存放在外部介质上的
 - 操作系统是以文件的形式存放在外部介质上的。
 
文件分类
- 按存储介质 
- 磁盘文件
 - 光盘文件
 - U盘文件
 
 - 按用途 
- 程序文件
 - 数据文件
 
 - 按文件中数据的组织形式
 - ASCII文件:以ASCII表示的文件,.txt,.cpp
 - 二进制文件:用二进制形式表示的文件,可以是.o,.exe等程序文件,也可以是特定格式的数据文件
 
文件流
- 输出文件流是从内存流向外存文件的数据
 - 输入文件流是从外存文件流向内存的数据
 - 每一个文件流都有一个内存缓存区与之对应

 - 文件流本身不是文件,是以文件为输入输出对象的流
 - 要对磁盘文件输入输出,必须通过文件流来实现
 - 文件操作需要流对象,cout,cin是已定义的流对象
 - 文件操作也要定义流对象,例:ofstream outfile;

 
文本文件的读写(ASCII文件)的读写
打开文件
- 打开文件是指在文件读写之前做必要的准备工作
(1)为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件
(2)指定文件的工作方式 
打开文件的两种不同方法
 (1)调用文件流的成员函数open,如
 ofstream outfile;//定义输出文件流类对象outfile.open("f1.dat",ios::out);
 
(2)在定义文件流对象时调用文件流类的构造函数
istream infile("c:\\new\\f1.dat",ios::in);
 
打开文件的方式
ios::in: 供读,文件不存在时,打开失败(ifstream默认的打开方式)
ios::out:供写,文件不存在则创建,若文件已存在,则清空原内容(ofstream默认的打开方式)
ios::ate:文件打开时,指针在文件最后,可改变指针的位置,常和in,out联合常用
ios::app:供写,文件不存在则创建,若文件已存在,则在原文件内容后添加写入新的内容
ios::trunc:在读写前先将文件长度截断为0(默认)
ios::nocreate:文件不存在时产生错误,常用in或app联合使用
ios::noreplace:文件存在时产生错误,常与out联合使用
ios::binary:二进制格式文件
fstream f("d:\\str\\score.dat",ios::in | ios::out | ios::binary);//以读写方式打开二进制文件
 
- 打开操作失败,open函数的返回值为0假
 
if(!outfile.open("fa.dat",ios::app))
{cerr<<"open error!";exit(1);
}
 
关闭文件
- 在对已打开的磁盘文件的读写操作完成后,应关闭该文件。
 - 关闭文件,将缓冲区的数据妥善处理,解除了磁盘文件与文件流的关联,不再通过文件流对该文件进行输入或输出
 
ofstream outfile("f1.dat",ios::out);
outfile.close();
 
将数据写入ASCII文件
- 读入十个数字
 
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;int main()
{int a[10];for (int i = 0; i < 10; i++){a[i] = i;}//打开文件ofstream ofs("f1.dat", ios::out);//读入for (int i = 0; i < 10; i++){ofs << a[i] << ' ';}//关闭文件ofs.close();return 0;
}
 
从ASCII文件读入数据
- 读出十个数字
 
#include <iostream>
#include <fstream>
using namespace std;int main()
{int a[10];//打开文件ifstream ofs("f1.dat", ios::in);//读出数据for (int i = 0; i < 10; i++){ofs >> a[i];}for (int i = 0; i < 10; i++){cout << a[i] << ' ';}//关闭文件ofs.close();return 0;
}
 
- 读入一行字符,把小写字母字符依次存储在磁盘文件f2.dat中。再把它从磁盘文件读出程序,将其中小写字母改为大写字母,再存入磁盘。
 
#include <iostream>
#include <fstream>
using namespace std;void save_to_file()
{ofstream outfile("f2.dat");char c[80];cin.getline(c, 80);for (int i = 0; c[i] != '\0'; i++){if (c[i] >= 'a' && c[i] <= 'z'){outfile.put(c[i]);}}outfile.close();
}void get_from_file()
{char ch;ifstream infile("f2.dat");ofstream outfile("f3.dat");while (infile.get(ch)){outfile.put(ch - 32);}infile.close();outfile.close();
}int main()
{save_to_file();get_from_file();return 0;
}
 
二进制存储
- 对于数值数据,ASCII数据与二进制形式不同
 - short int类型 12345
用ASCII形式存储

文件打开是长这样的

如果用二进制形式存储
其实就是用两个字节(short int)来存储 

 而我们打开文件看到的是(有时候会显示出莫名其妙的符号,二进制不是给人看的,是用来存储数据的)
 
对比ASCII和二进制存储
- ASCII文件直观,便于人阅读,但一般占存储空间较多,且需要花费时间转换;
 - 二进制文件是计算机的内部形式,节省空间,且不需要转换,但不能直观显示。
 - 对于字符信息,在内存中是以ASCII形式存放,无论是用ASCII文件输出,还是二进制文件输出,形式一样的。
 
用成员函数read和write读写二进制文件
打开方式
ofstream ofs("file1.dat",ios::out | ios::binary);
ifstream ifs("file2.dat",ios::in  | ios::binary);
 
文件读写方式
istream& read(char *buffer,int len);
ostream& write(const char *buffer,int len);
char *buffer 指向内存中的一段存储空间
int len 是读写的字节数
例如:
ofs.write(p1,50)//将p1指向的空间中50个字节存入文件对象ifs
ifs.read(p2,30)//将文件对象b读出30个字节,存之p2指向空间
文件的读入与读出
#include <iostream>
using namespace std;
#include <fstream>struct student
{char name[5];int num;int age;char sex;
};int main()
{student stu[3] ={{"Li",25,18,'f'},{"Wang",32,19,'m'},{"Fun",40,16,'f'}};//读到文件里ofstream outfile("stu.dat", ios::binary);for (int i = 0; i < 3; i++){outfile.write((char*)&stu[i], sizeof(stu[i]));}outfile.close();//从文件里读入内存student stu1[3];ifstream infile("stu.dat", ios::binary);for (int i = 0; i < 3; i++){infile.read((char*)&stu1[i], sizeof(stu1[i]));}infile.close();for (int i = 0; i < 3; i++){cout << "No." << i + 1 << endl;cout << "Name:" << stu1[i].name << endl;cout << "Num:" << stu1[i].num << endl;cout << "Age:" << stu1[i].age << endl;cout << "sex:" << stu1[i].sex << endl;}return 0;
}
相关文章:
【C++】文件
目录 文件文件分类文本文件的读写(ASCII文件)的读写打开文件打开文件的方式关闭文件将数据写入ASCII文件从ASCII文件读入数据 二进制存储对比ASCII和二进制存储用成员函数read和write读写二进制文件打开方式文件的读入与读出 文件 所谓文件,一般指存储在外部介质上…...
uniapp离线在Xcode上打包后提交审核时提示NSUserTrackingUsageDescription的解决方法
uniapp离线在Xcode上打包后提交审核时提示NSUserTrackingUsageDescription的解决方法 问题截图: 亲测有效的方法 方法一: 选择通过uniapp的开发工具Hbuilder来进行在线打包,取消默认勾选的以下选项。 然后进行在线打包就不会存在提交审…...
【Linux】进程exec函数族以及守护进程
一.exec函数族 1.exec函数族的应用 在shell下敲shell的命令都是在创建shell的子进程。而我们之前学的创建父进程和子进程代码内容以及通过pid与0的关系来让父子进程执行不同的代码内容都是在一个代码文件里面,而shell是如何做到不在一个文件里面写代码使之成为子进…...
为什么 ChatGPT 不火了?
不火了是有原因的,下面我来从大部分人拿到 ChatGPT 之后的两大痛点开始讲起: 很多朋友拿到 ChatGPT 后的第一个痛点就是:用的不好 你经常会感觉到 ChatGPT 回答的好空,没有太多参考价值。 而第二个痛点则是:无处去用…...
Ubuntu22.04下安装kafka_2.11-0.10.1.0并运行简单实例
目录 一、版本信息 二、安装Kafka 1.将Kafka安装包移到下载目录中 2.下载Spark并确保hadoop用户对Spark目录有操作权限 三、启动Kafka并测试Kafka是否正常工作 1.启动Kafka 2.测试Kafka是否正常工作 一、版本信息 虚拟机产品:VMware Workstation 17 Pro 虚…...
【S32K3 MCAL配置】-7.2-GPT Driver:仿OS,周期/定时调用APP SWC和BSW模块的主函数
"><--返回「Autosar_MCAL高阶配置」专栏主页--> 案例背景:当没有移至FreeRTOS时,如何仿OS,快速搭建“若干个周期执行的Task”,在其中周期/定时调用APP SWC和BSW模块的主函数。 并在这个简易的仿OS中,如何设置“主函数调用的先后顺序”,以及如何设置“主函…...
golang内置包里面的sort.Slice 切片排序函数使用示例
go语言里面用的最多的数据类型应该是切片Slice了, 今天就给大家介绍这个go内置包里面的切片排序函数的使用方法 函数原型 func Slice(x any, less func(i, j int) bool) 参数说明 这个函数有2个参数, 第一个是你要进行排序的slice切片,地个…...
Golang | Leetcode Golang题解之第70题爬楼梯
题目: 题解: func climbStairs(n int) int {sqrt5 : math.Sqrt(5)pow1 : math.Pow((1sqrt5)/2, float64(n1))pow2 : math.Pow((1-sqrt5)/2, float64(n1))return int(math.Round((pow1 - pow2) / sqrt5)) }...
区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(三)
🐶原文: Preventing Content Cloning in NFT Collections 🐶写在前面: 这是一篇 2023 年的 CCF-C 类,本博客只记录其中提出的方法。 F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT and Blockchains with Native S…...
Unity技术学习:渲染大量物体的解决方案,外加RenderMesh、RenderMeshInstanced、RenderMeshIndirect的简单使用
叠甲:本人比较菜,如果哪里不对或者有认知不到的地方,欢迎锐评(不玻璃心)! 导师留了个任务,渲染大量的、移动的物体。 寻找解决方案: 当时找了几个解决方案: 静态批处…...
[数据概念|方案实操][最新]数据资产入表4月速递
“ 在各地数据资产变现“热辣滚烫”” 国家数据局全国数据工作会议前后,数据资源“入表”的尝试在各地持续热火朝天地展开,多地实现数据资产入表和利用数据资产进行融资实现“零的突破”。 我们今天就把4月前后的案例做一个小结,之前的案例大…...
C++中使用Multimap和Vector管理和展示数据
一: 在本文中,我们将探讨如何在C中使用vector和multimap容器来管理一个简单的员工数据系统。我们将创建一个员工类,随机生成员工数据,将员工分组,并展示各组员工的详细信息。此示例展示了C标准模板库(STL&…...
Java---类和方法的再学习
上一篇主要介绍了面向对象的思想以及内存实现,关于类与对象感觉写的不够好,因此才会有这一篇作为补充; 一:类与对象 (1)类 一些相同属性和行为的事物的统称,比较广泛、抽象,比如…...
C语言每日一练(12、水仙花数)
在编程的领域中,我们常常会遇到一些有趣而富有挑战性的问题。今天,让我们一起来探讨一个经典的编程题目——打印出所有的“水仙花数”。 所谓“水仙花数”,是指一个三位数,其各位数字的立方和等于该数本身。例如,153 …...
HTML5实现酷炫个人产品推广、工具推广、信息推广、个人主页、个人介绍、酷炫官网、门户网站模板源码
文章目录 1.设计来源1.1 主界面1.2 我的产品界面1.3 关于我们界面1.4 照片墙界面1.5 发展历程界面1.6 优秀人才界面1.7 热门产品界面1.8 联系我们界面 2.灵活调整模块3.效果和源码3.1 动态效果3.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.c…...
系统如何做好安全加固?
一、Windows系统 Windows系统出厂时,微软为了兼容性,默认并未对系统安全做严格的限制,因此还需要做一些基本的安全加固,方可防止黑客入侵。 1、系统补丁更新 为什么要更新系统补丁?很多人感觉漏洞更新没必要&#x…...
对NI系统和PLC系统的应用比较
以下是对这两种系统的基本比较: 1. 设计和功能性 NI系统: 通常基于LabVIEW等软件平台,提供强大的数据采集、信号处理和图形界面开发能力。高度模块化和可扩展,支持各种传感器和信号类型。适合进行复杂的数据分析和高级控制算法的…...
微服务架构中的挑战及应对方式:Outbox 模式
使用 Outbox 模式保持微服务数据一致性 在一个由许多小型服务组成的系统中保持数据一致性是困难的,因为它们分散在各处。以下是一些常见问题以及如何处理它们的方法:当服务发送消息时,同时更新数据库和发送消息是棘手的问题。 在微服务中发出…...
使用Docker安装MySQL5.7.36
拉取镜像并查看 docker pull mysql:5.7.36拉取成功后查看(非必须) docker images创建并设置宿主机 mysql 配置文件目录和数据文件目录 创建相关文件夹将容器中的mysql数据保存到本地,这样即使容器被删除,数据也不会丢失。 mkd…...
【PyTorch】6-可视化(网络结构可视化、CNN可视化、TensorBoard、wandb)
PyTorch:6-可视化 注:所有资料来源且归属于thorough-pytorch(https://datawhalechina.github.io/thorough-pytorch/),下文仅为学习记录 6.1:可视化网络结构 Keras中可以调用model.summary()的API进行模型参数可视化 torchinfo…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
AD学习(3)
1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分: (1)PCB焊盘:表层的铜 ,top层的铜 (2)管脚序号:用来关联原理图中的管脚的序号,原理图的序号需要和PCB封装一一…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
python可视化:俄乌战争时间线关键节点与深层原因
俄乌战争时间线可视化分析:关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一,自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具,系统分析这场战争的时间线、关键节点及其背后的深层原因,全面…...
