c++输入输出流和文件操作总结

news2024/11/15 19:38:52

目录

一、c++的输入输出流——>

指的是字节流的数据传送;具有类型安全和可扩展性。

 二、流的出入路径

 三、c++流类库

①概览

②标准输出流:

③标准输入流:

四、文件操作(ascii文件和二进制文件)

 五、字符串流(或称内存流)


一、c++的输入输出流——>

指的是字节流的数据传送;具有类型安全和可扩展性。

从操作系统的角度来看,我们可以将每个输入输出设备都视作一个文件,程序的输入输出即可视为数据在文件—程序间的传输:

输入文件——>程序——>输出文件

对于C++,输入输出包括3方面:

1、标准I/O;(系统指定的标准设备如键盘、显示器)

2、文件I/O;(外存,如磁盘)

3、串I/O。(内存中指定空间,常用一个字符数组存储各类数据)
​

 二、流的出入路径

可以如下表示:

内存为字节流开辟内存缓冲区,用于存放数据。

反过来说,缓冲区中的数据即为流。

cout<<(cout流或标准输出流) 流路径===》

程序——>输出流——>输出缓冲区——>显示器
(保存于缓冲区时,当①缓冲区满②遇到endl,将数据送出)
 (\n不会刷新缓冲区,但有时一些编译系统也不过多区分)
​

对于输入的数据,当按下回车键===》

键盘缓冲区——>输入缓冲区,并形成流。

 三、c++流类库

①概览

·stdin(标准输入设备)为参数,使cin与设备关联。(cin流:标准输入流)

·istream(ostream也是)类中重载<<,对不同类型都要分别重载一次。

·cout<<"111"等价于cout.operator<<("111") ,调用的重载是(char *)型-----字符串111的值为其首字节的地址。

·cout将数据插入到cout流,函数返回流对象cout

②标准输出流:

iostream头文件中定义了4种流对象cin,cout,cerr,clog

cerr是标准错误流,输出于标准错误设备(stderr)(区分于正常输出(stdout)),且cerr流中的信息只在显示器输出。它与clog的区别仅有,cerr不经过缓冲区存放、而是直接输出的。

cout.put('a')

输出a;(专门输出单字符,参数为字符或ascii码)

连续调用:cout.put(65).put(66).put('\n');

基本等价于c语言中的putchar();

③标准输入流:

>>通常跳过空格和换行符等;

cin为非0值:输入流在正常状态,提取操作成功;(“文件结束符”:ctrl+Z或+D)

成员函数get:

一、cin.get();返回读入的字符(包括空白字符);
              若遇到文件结束符,返回EOF(-1).
二、cin.get(ch);
              读取失败返回0.
   //前两种用法同C语言中的getchar
三、cin.get(字符数组,字符数n,终止符);
               读取n-1个字符(!!!);失败返回0.

getline:

cin.getline(字符数组,字符数n,终止符);
​

(上面两个“字符数组”都可替换为字符指针;(存入其指向的数组))

(终止符由自己选定;)

(都读取n-1个字符,末尾加上'\0'。)

【对cin.getline和cin.get说明】:

/cin.getline(arr,20),同样可读取空格,在读取完指定数目字符后或者遇到换行符时,停止读取。如例参数为20,则至多读取19个字符,余下空间存储自动添加在结尾的\0。

/格式类似的,还有cin.get(arr,20),不同的是geline读取并丢弃换行符,而cin.get仅将其留在输入队列中。同样cin也会将回车键生成的换行符留下。一般后面再要输入时,得加一个无参数的cin.get(),读取下一个符号即处理留下的换行符。否则直接输入时会因为检测到换行符而认为已到行尾而不再读取。
 

eof:cin.eof();

若到达文件末尾(遇文件结束符)——>函数值非0。

peek:cin.peek();

观测当前指针所指字符。(之所以能观测下一个,是因为当读取完一个字符,指针已跳到下一个)

putback:cin.putback(ch);

前面用get/getline读取的某一字符ch返回到输入流并插入到当前指针位置。(往后读第一个便能读取)(例如,可用在一个字符数组c,终止后可以继续读取c)

ignore:cin.ignore(n,终止符);

括号内容含义:(跳过输入流中的n个字符,遇到终止符不再跳过)//也可不带参数或带一个。

默认:cin.ignore()==cin.ignore(1,EOF)。

四、文件操作(ascii文件和二进制文件)

(源程序文件.cpp,目标文件.obj,可执行文件.exe,数据文件date file.)

1、根据文件中数据组织形式,将文件分为两类:

ASCII文件/字符文件/文本文件:每个字节放一个ascii码
二进制文件/内部格式文件/字节文件:按在内存中的存储形式原样输出

 字符信息在内存中以ascii码存放,此时二种文件输出时,数据形式一样。

对于数字,则数据形式不同。(ascii为逐字,内部格式为数字值)

 · ascii文件,便于屏幕直接阅读,但存储时转换耗时多,占空间多。

2、文件流:以外存文件为I/O对象的数据流,每个文件流有一个内存缓冲区与之对应。

外存文件输入————>内存————>输出到外存文件

文件流对象需要自己定义;(如定义输出文件流对象:ofstream outfile;)

②调用成员函数open:

outfile.open("f1.dat",ios::out);

//文件名可包括路径("c:\new\f1.dat"),后面是输入输出方式,默认是ios::out,可省写
​
​

//以上两步可合并:ofstream outfile("f1.dat",ios::out);——(调用了带参数的构造函数

若打开失败,open返回0;对构造函数,失败时流对象值为0

成员函数close:

outfile.close();——解除该文件与文件流的关联。

outfile<<a[i]....——向关联的磁盘文件输出数据。

exit(1);——应用程序终止并返回状态码1。

再次用不同方式打开一个文件前,先关闭

/对于ascii文件,一字节放一字符,如:一篇英文文章的文本文件。操作就是正常文本读写。

/对二进制文件(内存数据的映像文件/字节文件),打开时要用ios::binary指定。可以作为既能输出又能输入的文件。↓↓↓

3、二进制文件操作

①成员函数write,read:

ofstream outfile("filename",ios::out|ios::binary);//ios::out可省略

outfile.write(p,50);
//将字符指针p指向的单元的开始的50个字节的内容,不加转换地写到与outfile关联的磁盘文件中
​

对于ifstream对象,读入50个字节存放在字符指针p所指空间内。

(上面括号内的形参(p处)是字符指针或者字符串的首地址,注意类型匹配!

(abort();——>退出程序,同exit(1).)

两种结构体指针的write方法:
1、for循环
2、outfile.write((char*)&stru[0],sizeof(stru));
//输出数据间不必加空格(靠字节数来控制读入数据)

与位置标记(可以理解为,外存版的指针)有关的成员函数:

gcount()
tellg()/tellp()
seekg(位置)/seekp(位置)
也可用双参数(位移量,参照位置)
参照位置:
ios::beg(默认)
ios::cur
ios::end

 五、字符串流(或称内存流)

字符串流不同于字符数组,可以按其他类型的数据形式读取数据。

向字符数组存入数据前,先将数据从二进制形式转换为ascii码放在缓冲区,后再发送。

从字符数组读取数据时,先将其中的ascii数据送到缓冲区后再发送,转换为二进制形式给程序中变量。

简而言之:
二进制——>输入给变量
ascii——>输出到屏幕

对于文件有文件结束符,对str,需自己指定一个特殊字符为结束标志。

①建立输出字符串流对象(并与字符数组关联)

ostrstream strout(arr,20); //20为缓冲区长度
​

 strout<<ends;  //用操作符ends向流插入一个'\0'。(通常作为字符串结束标志)

转换为ascii代码存入到字符数组。

②建立输入字符串流对象

istrstream strin(arr2,20); //若无20,则全部数据都作为流中内容

③输入输出对象:

strstream io(arr3,n,ios::in|ios::out);

输入字符串流和输出字符串流分别有流位置标记。

输出字符串流从数组首地址开始,会更新其中内容。

存取速度快但有生命周期,一般同main。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Amazon CodeWhisperer 免费 AI 代码生成助手体验分享

今年上半年&#xff0c;亚马逊云科技正式推出了实时AI编程助手 Amazon CodeWhisperer&#xff0c;还提供了供所有开发人员免费使用的个人版版本。经过一段时间的体验&#xff0c;我觉得 CodeWhisperer 可以处理编程工作中遇到的很多问题&#xff0c;并且帮助开发人员提高编程效…

opencv和gdal的读写图片波段顺序问题

最近处理遥感影像总是不时听到 图片的波段错了&#xff0c;一开始不明就里&#xff0c;都是图片怎么就判断错了。 1、图像RGB波段顺序判断 后面和大家交流&#xff0c;基本上知道了一个判断标准。 一般来说&#xff0c;进入人眼的自然画面在计算机视觉中一般是rgb波段顺序表示…

【Java EE初阶三 】线程的状态与安全(上)

1. join方法与多线程 1.1 初识多线程 为了提高cpu得利用率&#xff0c;因此就引入了多个线程的概念&#xff1b;即每个线程负责完成整个程序的一部分工作即可。 写一个代码&#xff0c;让主线程&#xff0c;创建一个新的线程&#xff0c;由新线程负责完成运算&#xff08;12。…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK实现Raw格式的图像保存&#xff08;C&#xff09; Baumer工业相机Baumer工业相机通过SDK实现Raw格式的图像保存的技术背景通过SDK获取相机信息的代码分析Baumer工业相机回调函数里保存原始图像数据Baumer保存Raw图像格式重要核心代…

时尚男童穿搭 I 棒球服穿搭永不过时

华棉刷毛复合牛奶丝面料 优质的华棉材质&#xff0c;轻柔中带着韧劲拥有卓越的软糯触感 平整的布面复合细腻的绒毛&#xff0c;增加挺阔感基础的佰搭款&#xff0c;利用率真的高 因为版型宽松&#xff0c;不挑身材&#xff0c;怎么搭都好看绣花是hen时尚的字母类绣花 韩范十…

用编程解决习题【计算机图像处理】

用编程解决习题【计算机图像处理】 前言版权第三章 03采样量化与像素间关系三种距离计算编程 第六章 06图像的直方图变换均衡化直方图编程规定化直方图编程 第七章 07图像的噪声抑制均值滤波 中值滤波计算编程knn滤波计算编程 第十章 10二值图像的分析贴标签 膨胀 腐蚀编程 最后…

网络隔离后,怎样建立高效安全的数据安全交换通道?

数据安全对企业生存发展有着举足轻重的影响&#xff0c;数据资产的外泄、破坏都会导致企业无可挽回的经济损失和核心竞争力缺失。数据流动才能让其释放价值&#xff0c;想要保护企业核心资产&#xff0c;就要实现数据安全交换。 很多企业为了防止知识产权、商业机密数据泄露&am…

python嵌套异常处理器

1 python嵌套异常处理器 python的异常处理器支持嵌套。 1.1 嵌套的try/except处理器 用法 def f1():raise E def f2():try:f1()except E:pass try:f2() except E:pass描述 嵌套的try/except处理器&#xff0c;发生异常时&#xff0c;控制权会跳回具有相符的except分句、最近…

钉钉机器人接入定时器(钉钉API+XXL-JOB)

钉钉机器人接入定时器&#xff08;钉钉APIXXL-JOB&#xff09; 首先需要创建钉钉内部群 在群设置中找到机器人选项 选择“自定义”机器人 通过Webhook接入自定义服务 创建完成后会生成一个send URL和一个加签码 下面就是干货 代码部分了 DingDingUtil.sendMessageByText(webho…

相机内参标定理论篇------相机模型选择

相机种类&#xff1a; 当拿到一款需要标定内参的相机时&#xff0c;第一个问题就是选择那种的相机模型。工程上相机类型的划分并不是十分严格&#xff0c;一般来说根据相机FOV可以把相机大概分为以下几类&#xff1a; 长焦相机&#xff1a;< 标准相机&#xff1a;~&…

gin框架使用系列之六——自定义中间件

系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》《gin框架使用系列之五——表单校验》 一、gin中间件概述 gin中将…

开源项目推荐:Frooodle/Stirling-PDF

简介一个本地的处理 PDF 的工具&#xff0c;界面是 Web UI&#xff0c;可以支持 Docker 部署。各种主要的 PDF 操作都可以支持。比如拆分、合并、转换格式、重新排列、添加图片、旋转、压缩等等。这个本地托管的网络应用最初完全由 ChatGPT 制作&#xff0c;后来逐渐发展&#…

数据结构学习 Leetcode322 零钱兑换

关键词&#xff1a;动态规划 完全背包 记忆化搜索 一个套路&#xff1a; 01背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要逆序遍历完全背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要正序遍历 题目&#xff1a; 方法一&#xff…

【Docker-Dev】Mac M2 搭建docker mysql

Mac M2 搭建Mysql 1、前言2、前置说明-Docker的代理访问3、前置说明-Mysql的镜像访问3.1、提取信息3.1.1、开启Mysql的实例3.1.2、Dokcer连接Mysql3.1.3、官方简易版的docker-compose3.1.4、如何登录mysql bash3.1.5、自定义my.cnf文件3.1.6、如何知道其他自定义配置项 4、M2安…

【算法题】矩阵顺时针旋转90° (js)

力扣链接&#xff1a;https://leetcode.cn/problems/rotate-matrix-lcci/description/ 本人题解&#xff1a; /*** param {number[][]} matrix* return {void} Do not return anything, modify matrix in-place instead.*/ var rotate function (matrix) {const x matrix.le…

[SWPUCTF 2021 新生赛]finalrce

[SWPUCTF 2021 新生赛]finalrce wp 注&#xff1a;本文参考了 NSSCTF Leaderchen 师傅的题解&#xff0c;并修补了其中些许不足。 此外&#xff0c;参考了 命令执行(RCE)面对各种过滤&#xff0c;骚姿势绕过总结 题目代码&#xff1a; <?php highlight_file(__FILE__); …

【算法】运用滑动窗口方法解决算法题(C++)

文章目录 1. 滑动窗口 介绍2. 滑动窗口算法引入209.长度最小的子数组 3. 使用滑动窗口解决算法题3.无重复字符的最长子串1004.最大连续1的个数III1658.将x减到0的最小操作数904.水果成篮LCR015.找到字符串中所有字母异位词30.串联所有单词的子串76.最小覆盖子串 1. 滑动窗口 介…

在Vue2中快速使用ECharts

在Vue2中快速使用ECharts ECharts这里简单介绍一下ECharts的图表其他图表 背景: 因为博主在做项目时&#xff0c;有一个需求要求是可视化渲染出文章的分类信息以及文章内容&#xff0c;当时第一时间就想到了ECharts&#xff0c;因此就引入了在Vue2中快速使用ECharts。 ECharts …

详细讲解Java使用EasyExcel函数来操作Excel表(附实战)

目录 前言1. EasyExcel类2. 原理分析3. demo4. 实战 前言 前阵时间好奇下载Excel&#xff0c;特意学习实战了该功能&#xff1a;详细讲解Java使用HSSFWorkbook函数导出Excel表&#xff08;附实战&#xff09; 现在发觉还有个EasyExcel也可专门用来读写Excel表 1. EasyExcel类…

张驰咨询:如何战胜实施精益生产培训的常见难题?

精益生产又称作“Lean Manufacturing”或“Lean Production”&#xff0c;它是一种强调消除生产过程中一切形式的浪费&#xff0c;注重流程优化以提升整体效能的管理哲学。源自丰田生产系统&#xff08;Toyota Production System&#xff09;&#xff0c;精益生产培训目标在于最…