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

目录

一、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://xiahunao.cn/news/2659274.html

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

相关文章

【力扣题解】P94-二叉树的中序遍历-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P94-二叉树的中序遍历-Java题解&#x1f30f;题目描述&#x1f4a1;题解&#x1f30f…

oracle与mysql的分析函数(窗口函数)

分析函数定义 在SQL语句中&#xff0c;很多查询语句需要进行GROUP BY分组汇总&#xff0c;但是一旦经过分组&#xff0c;SELECT返回的记录数就会减少。为了保留所有原始行记录&#xff0c;并且仍可以进行分组数据分析&#xff0c;分析函数应运而生。 Oracle 8i 版本开始支持窗…

C++实现令牌桶过滤算法

什么是令牌桶算法 令牌桶算法通过限制令牌桶的固定容量&#xff0c;实现对资源以及流量的延迟控制。请求者需先获取令牌&#xff0c;方可执行动作。若令牌桶内具有足够令牌便可通过消耗相等数量放过请求&#xff1b;而若令牌不足&#xff0c;则会拒绝请求。 该算法具备平滑的…

C语言停车场模型详解

C语言停车场模型详解 1. 引言2. 代码概述3. 代码详解3.1 定义常量和数据结构3.2 初始化车库3.3 查找车辆所在车库3.4 查找车辆所在的车位3.5 打印车库状态3.6 打印等候车辆3.7 车辆入库3.8 车辆出库3.9 菜单功能3.10 主函数 5.效果展示5.完整代码6. 总结 1. 引言 本文将介绍一…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图&#xff1a; CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…

生成式 AI 原生开发

如何成为生成式AI原生开发者&#xff0c;快速进入&#xff1a; 下一站 GenAI QCon 上海站喊你上车啦&#xff01; 无限构建&#xff0c;成为生成式 AI 原生开发者&#xff0c;12 月 28 日&#xff0c;下一站 GenAI 巴士即将抵达 QCon 全球软件开发大会上海站&#xff0c;码…

人大女王金融硕士为何是在职金融人士提升自己的首选?一起来看看

在这个经济飞速发展的时代&#xff0c;职场竞争愈发激烈&#xff0c;如果一味的安于现状&#xff0c;那么很有可能被社会所淘汰。近年来&#xff0c;金融行业的发展更是迅速&#xff0c;对于高端人才的需求也越来越大。所以对于从事这行的工作者来说&#xff0c;在职研究生就是…

QML —— RadioButton的两个经典示例(附完整源码)

示例1-效果 示例2-效果 实例1 - 源码 import QtQuick 2.12 import QtQuick.Window 2.12import QtQuick.Layouts 1.12 import QtQuick.Controls 2.5Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Text{id: classNametext: qsTr("--&quo…

金融贷款行业怎么精准获客,电销打吐了!教你两招

助贷行业&#xff0c;一般都会设有kpi&#xff0c;压力竞争都不小。虽然现在贷款电销大家对此意见不同&#xff0c;但是&#xff0c;不可否认&#xff0c;这个行业&#xff0c;电销就是它们最快速的获客方式。只要耐得住性子&#xff0c;有一份精准的话单&#xff0c;就可以开工…

在线教育系统源码解读:定制化企业培训APP的开发策略

当下&#xff0c;企业培训正经历着一场数字化的迭代&#xff0c;定制化企业培训APP应运而生&#xff0c;成为提升员工技能、推动企业发展的重要工具。下文小编将与大家一同深入了解在线教育系统的源码&#xff0c;探讨开发定制化企业培训APP的策略&#xff0c;以满足不同企业的…

AI大模型引领未来智慧科研暨ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

yolov8 细胞分割数据集准备及训练

1、数据 下载:https://universe.roboflow.com/motherson-hm/5-part-diff 500来张,5个类别(嗜碱性细胞、嗜酸细胞、淋巴细胞、单核细胞、中性粒细胞) yolo 分割数据标注格式: 与检测类似,就是坐标分割有多个 2、训练 训练yaml: seg_data.yaml (与检测格式一样) …

代码随想录算法训练营day1|704.二分查找、27.移除元素

第一章 数组 part01 今日任务 数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 详细布置 数组理论基础 文章链接&#xff1a;代码随想录 题目建议&#xff1a; 了解一下数组基础&#xff0c;以及数组的内存空间地址&#xff0c;数组也没那么简单。 704. 二…

玩转安卓手机录屏,轻松掌握录屏技巧!

“安卓手机有录屏功能吗&#xff1f;新买了一部安卓手机&#xff0c;因为之前都是在用苹果手机&#xff0c;所以有点不习惯&#xff0c;最近需要用到录屏功能&#xff0c;但怎么都找不到&#xff0c;希望大家教教我&#xff0c;安卓手机怎么录屏&#xff1f;” 在现代社交媒体…

Redis中RDB和AOF

Redis中RDB和AOF 定时间间隔执行数据集的时间快照&#xff0c;把某一时刻数据和妆容以文件的形式写到磁盘上&#xff0c;也就是快照。 配置文件 如果是普通安装方式可以跳过&#xff0c;如果是docker安装&#xff0c;需要到官网下载redis.conf配置文件到本地&#xff0c;地址…

常见HTTP 500错误发生原因及解决办法剖析

​  对于网站运营者来说&#xff0c;提到500内部服务器错误并不陌生。互联网行业对它的称呼有好几种&#xff0c;如“500内部服务器错误”、“HTTP 500 - 内部服务器错误”、“临时错误 (500)”、“内部服务器错误”。尽管叫法不同&#xff0c;但根本问题是相同的。 目前&…

单片机外设矩阵键盘之行列扫描识别原理与示例

单片机外设矩阵键盘之行列扫描识别原理与示例 1.概述 这篇文章介绍单片机通过行列扫描的方式识别矩阵键盘的按键&#xff0c;通过程序执行相应的操作。 2.行列扫描识别原理 2.1.独立按键识别原理 为什么需要矩阵按键 独立按键操作简单&#xff0c;当数量较多时候会占用单片机…

Talk | ACM MM 2023最佳论文,CATR:基于组合依赖和音频查询的视频分割模型

本期为TechBeat人工智能社区第558期线上Talk。 北京时间12月27日(周三)20:00&#xff0c;浙江大学博士生—李可欣的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “CATR-基于组合依赖和音频查询的视频分割模型”&#xff0c;介绍了她的团队在基于组…

BDTC2023:CloudberryDB开源创新与实践

中国大数据技术大会&#xff08;BDTC&#xff09;由中国计算机学会&#xff08;CCF&#xff09;创立于2008年&#xff0c;已经成为国内外极具行业实践的专业大数据交流平台。12月22日-24日&#xff0c;第十七届中国大数据技术大会&#xff08;BDTC 2023&#xff09;在广州举行。…

【map】【滑动窗口】【优先队列】LeetCode480滑动窗口中位数

作者推荐 动态规划 多源路径 字典树 LeetCode2977:转换字符串的最小成本 本题涉及知识点 滑动窗口 map 优先队列 题目 中位数是有序序列最中间的那个数。如果序列的长度是偶数&#xff0c;则没有最中间的数&#xff1b;此时中位数是最中间的两个数的平均数。 例如&#xf…