当前位置: 首页 > news >正文

【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读写二进制文件打开方式文件的读入与读出 文件 所谓文件&#xff0c;一般指存储在外部介质上…...

uniapp离线在Xcode上打包后提交审核时提示NSUserTrackingUsageDescription的解决方法

uniapp离线在Xcode上打包后提交审核时提示NSUserTrackingUsageDescription的解决方法 问题截图&#xff1a; 亲测有效的方法 方法一&#xff1a; 选择通过uniapp的开发工具Hbuilder来进行在线打包&#xff0c;取消默认勾选的以下选项。 然后进行在线打包就不会存在提交审…...

【Linux】进程exec函数族以及守护进程

一.exec函数族 1.exec函数族的应用 在shell下敲shell的命令都是在创建shell的子进程。而我们之前学的创建父进程和子进程代码内容以及通过pid与0的关系来让父子进程执行不同的代码内容都是在一个代码文件里面&#xff0c;而shell是如何做到不在一个文件里面写代码使之成为子进…...

为什么 ChatGPT 不火了?

不火了是有原因的&#xff0c;下面我来从大部分人拿到 ChatGPT 之后的两大痛点开始讲起&#xff1a; 很多朋友拿到 ChatGPT 后的第一个痛点就是&#xff1a;用的不好 你经常会感觉到 ChatGPT 回答的好空&#xff0c;没有太多参考价值。 而第二个痛点则是&#xff1a;无处去用…...

Ubuntu22.04下安装kafka_2.11-0.10.1.0并运行简单实例

目录 一、版本信息 二、安装Kafka 1.将Kafka安装包移到下载目录中 2.下载Spark并确保hadoop用户对Spark目录有操作权限 三、启动Kafka并测试Kafka是否正常工作 1.启动Kafka 2.测试Kafka是否正常工作 一、版本信息 虚拟机产品&#xff1a;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了&#xff0c; 今天就给大家介绍这个go内置包里面的切片排序函数的使用方法 函数原型 func Slice(x any, less func(i, j int) bool) 参数说明 这个函数有2个参数&#xff0c; 第一个是你要进行排序的slice切片&#xff0c;地个…...

Golang | Leetcode Golang题解之第70题爬楼梯

题目&#xff1a; 题解&#xff1a; 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(三)

&#x1f436;原文&#xff1a; Preventing Content Cloning in NFT Collections &#x1f436;写在前面&#xff1a; 这是一篇 2023 年的 CCF-C 类&#xff0c;本博客只记录其中提出的方法。 F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT​ and Blockchains with Native S…...

Unity技术学习:渲染大量物体的解决方案,外加RenderMesh、RenderMeshInstanced、RenderMeshIndirect的简单使用

叠甲&#xff1a;本人比较菜&#xff0c;如果哪里不对或者有认知不到的地方&#xff0c;欢迎锐评&#xff08;不玻璃心&#xff09;&#xff01; 导师留了个任务&#xff0c;渲染大量的、移动的物体。 寻找解决方案&#xff1a; 当时找了几个解决方案&#xff1a; 静态批处…...

[数据概念|方案实操][最新]数据资产入表4月速递

“ 在各地数据资产变现“热辣滚烫”” 国家数据局全国数据工作会议前后&#xff0c;数据资源“入表”的尝试在各地持续热火朝天地展开&#xff0c;多地实现数据资产入表和利用数据资产进行融资实现“零的突破”。 我们今天就把4月前后的案例做一个小结&#xff0c;之前的案例大…...

C++中使用Multimap和Vector管理和展示数据

一&#xff1a; 在本文中&#xff0c;我们将探讨如何在C中使用vector和multimap容器来管理一个简单的员工数据系统。我们将创建一个员工类&#xff0c;随机生成员工数据&#xff0c;将员工分组&#xff0c;并展示各组员工的详细信息。此示例展示了C标准模板库&#xff08;STL&…...

Java---类和方法的再学习

上一篇主要介绍了面向对象的思想以及内存实现&#xff0c;关于类与对象感觉写的不够好&#xff0c;因此才会有这一篇作为补充&#xff1b; 一&#xff1a;类与对象 &#xff08;1&#xff09;类 一些相同属性和行为的事物的统称&#xff0c;比较广泛、抽象&#xff0c;比如…...

C语言每日一练(12、水仙花数)

在编程的领域中&#xff0c;我们常常会遇到一些有趣而富有挑战性的问题。今天&#xff0c;让我们一起来探讨一个经典的编程题目——打印出所有的“水仙花数”。 所谓“水仙花数”&#xff0c;是指一个三位数&#xff0c;其各位数字的立方和等于该数本身。例如&#xff0c;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 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.c…...

系统如何做好安全加固?

一、Windows系统 Windows系统出厂时&#xff0c;微软为了兼容性&#xff0c;默认并未对系统安全做严格的限制&#xff0c;因此还需要做一些基本的安全加固&#xff0c;方可防止黑客入侵。 1、系统补丁更新 为什么要更新系统补丁&#xff1f;很多人感觉漏洞更新没必要&#x…...

对NI系统和PLC系统的应用比较

以下是对这两种系统的基本比较&#xff1a; 1. 设计和功能性 NI系统&#xff1a; 通常基于LabVIEW等软件平台&#xff0c;提供强大的数据采集、信号处理和图形界面开发能力。高度模块化和可扩展&#xff0c;支持各种传感器和信号类型。适合进行复杂的数据分析和高级控制算法的…...

微服务架构中的挑战及应对方式:Outbox 模式

使用 Outbox 模式保持微服务数据一致性 在一个由许多小型服务组成的系统中保持数据一致性是困难的&#xff0c;因为它们分散在各处。以下是一些常见问题以及如何处理它们的方法&#xff1a;当服务发送消息时&#xff0c;同时更新数据库和发送消息是棘手的问题。 在微服务中发出…...

使用Docker安装MySQL5.7.36

拉取镜像并查看 docker pull mysql:5.7.36拉取成功后查看&#xff08;非必须&#xff09; docker images创建并设置宿主机 mysql 配置文件目录和数据文件目录 创建相关文件夹将容器中的mysql数据保存到本地&#xff0c;这样即使容器被删除&#xff0c;数据也不会丢失。 mkd…...

【PyTorch】6-可视化(网络结构可视化、CNN可视化、TensorBoard、wandb)

PyTorch&#xff1a;6-可视化 注&#xff1a;所有资料来源且归属于thorough-pytorch(https://datawhalechina.github.io/thorough-pytorch/)&#xff0c;下文仅为学习记录 6.1&#xff1a;可视化网络结构 Keras中可以调用model.summary()的API进行模型参数可视化 torchinfo…...

机器人抓取技能自动化:从仿真学习到现实迁移的实践指南

1. 项目概述与核心价值最近在机器人抓取领域&#xff0c;一个名为simpliolabs/manus-open-claw-skill-hunter-and-developer的项目引起了我的注意。乍一看这个标题&#xff0c;它像是一个开源工具或框架&#xff0c;核心围绕着“机械手开放爪具”的“技能猎人”与“开发者”。这…...

别再死记硬背了!用SPSS搞定系统聚类法,手把手教你从数据录入到谱系图解读

SPSS系统聚类法实战&#xff1a;从数据导入到商业解读的全流程指南 当你的数学建模作业截止日期临近&#xff0c;或者老板突然要求对市场调研数据进行分类分析时&#xff0c;系统聚类法往往是救命稻草。但传统教材中复杂的距离矩阵计算和迭代过程&#xff0c;常让初学者望而生畏…...

为Cursor AI编程助手配置安全规则:防范代码生成风险

1. 项目概述&#xff1a;为什么我们需要为Cursor定制安全规则如果你是一名开发者&#xff0c;并且已经开始使用Cursor这样的AI编程助手&#xff0c;那你大概率已经体会过它带来的效率革命。它能帮你生成代码、重构函数、甚至解释复杂的逻辑。但效率提升的同时&#xff0c;一个隐…...

基于开源LLM构建私有化智能体:从意图解析到安全执行的工程实践

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫giocaizzi/ralph-copilot。乍一看这个名字&#xff0c;可能会让人联想到微软的 GitHub Copilot&#xff0c;但它的定位和实现方式其实非常不同。简单来说&#xff0c;这是一个基于开源大语言模型&#xff…...

瑞萨RL78/G16开发板与EZ-CUBE3仿真器连接调试全攻略

1. 项目概述与核心价值 最近在折腾瑞萨的RL78系列MCU&#xff0c;手头正好有一块RL78/G16的快速原型开发板和一个EZ-CUBE3仿真器。对于刚接触瑞萨生态的朋友来说&#xff0c;如何把这套硬件正确地连接起来&#xff0c;并成功跑通第一个LED闪烁程序&#xff0c;往往是入门路上的…...

直播抠图技术100谈之25---调色中曲线是最优解

为什么曲线调色是最优解 蓝松抠图在即将发布的版本中特意重写了曲线调节&#xff0c;把达芬奇的二级曲线重新做了一遍&#xff0c;并模仿达芬奇的节点图做了自己的节点图。我们为什么要重新设计曲线&#xff0c;因为我们认为调色中曲线是最优解&#xff1b; 结论 在所有调色手段…...

告别‘数据孤岛’的幻想:深入拆解联邦学习Non-IID问题的根源与EMD度量

告别“数据孤岛”的幻想&#xff1a;联邦学习Non-IID问题的本质与实战应对 当企业兴奋地部署联邦学习系统时&#xff0c;常会遭遇这样的尴尬&#xff1a;模型在各方本地数据上表现优异&#xff0c;聚合后却性能骤降。这背后隐藏着一个被低估的真相——数据天然独立同分布&#…...

Space Thumbnails:Windows资源管理器的终极3D模型预览解决方案

Space Thumbnails&#xff1a;Windows资源管理器的终极3D模型预览解决方案 【免费下载链接】space-thumbnails Generates preview thumbnails for 3D model files. Provide a Windows Explorer extensions that adds preview thumbnails for 3D model files. 项目地址: https…...

【MATLAB】基于MATLAB的图像加密传输平台【GUI+源码+项目说明】

【MATLAB】基于MATLAB的图像加密传输平台【GUI源码项目说明】 一、项目介绍 数字图像具有数据量大、像素间相关性强、视觉冗余度高的特点, 传统的字节级加密 (如 AES) 直接作用于图像比特流虽能保密, 但无法破坏图像在空间域的统计特征. 本项目采用 “Arnold 置乱 明文相关 Lo…...

PowerShdll源码深度分析:从DLL导出到控制台劫持的完整实现原理

PowerShdll源码深度分析&#xff1a;从DLL导出到控制台劫持的完整实现原理 【免费下载链接】PowerShdll Run PowerShell with rundll32. Bypass software restrictions. 项目地址: https://gitcode.com/gh_mirrors/po/PowerShdll PowerShdll是一个创新的PowerShell绕过工…...