C++·io流

本节主要是了解为主,需要具体使用时可以查看文档。

io流操作指的是对各种流的操作,我们经常使用的cin和cout是对标准流的操作 ,实际上它还可以对文件流操作

官网资料:Input/Output - C++ Reference

流输入和流提取功能的实现中有着非常复杂的继承关系,也有着众多的接口,但是我们使用时一般只会涉及到 cin和cout等几个接口。

1. C++标准io流

在C标准库中已经设定好了各种内置类型的标准流插入流提取功能,但是我们可以为自定义类型重载 >> << 运算符,来实现对自定义类型的标准输入输出,即cout数据从内存流向控制台,cin数据从键盘流到程序内存。

cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时是从缓冲区拿。如果一次输入过多,就会都先堆在缓冲区慢慢用,缓冲区中的内容读用一个走一个。如果出现输入的数据与要提取的数据类型不匹配的情况,cin就会提取0,比如 cin 's'字符 给一个整形变量,这就是不匹配的情况,那此时这个整型变量会提取到0,同时字符 's' 被继续堆在缓冲区,cin的状态标志被修改,cin暂时无法正常使用了。

1.1 io流状态标志

官网资料:ios - C++ Reference ios::good - C++ Reference

无论是 输入流istream 或是 输出流ostream 都具有上表中的四种状态标志,用来表示目前的这个流的使用状态,这四种状态标志是由它们的父类ios继承过来的。

四种状态标志分别是

使用good()函数查看的goodbit,为 1 代表流状态正常,为 0 说名状态异常

使用eof()函数查看的eofbit,为 1 代表流提取到了文件结尾,为 0 反之

使用fail()函数查看的failbit,为 1 代表流出现可修复的小问题,为 0 说明流状态正常

使用bad()函数查看的badbit,为 1 代表流出现不可修复的大问题,比如缓冲区出现破坏等,必须结束程序的情况,为 0 说明没出现大问题。

我们看下面这段代码:

​​​​​​​

在最初istream流都是一切正常的(红框),随后将 11t 输入进缓冲区中,第一次cin从缓冲区中流提取了11,发现t已经不是整形了于是不再提取,此时的istream流还没有问题(绿框)。第二次提取缓冲区中的数据时发现已经没有整形了,于是cin提取到默认值0,并将流状态标注成failbit(粉框)。此后istream流暂时不能再使用了,需要程序员进行手动修复。

failbit标志也就是说现在出现的问题只是小问题,我们有办法进行修复的,具体办法就是clear,重设流状态。

​​​​​​​ ​​​​​​​

上面还是刚才那段代码,在将状态重设后就显示流状态正常了,此时仅仅时istream可以使用了。但是缓冲区中的那个 't'字符 因为没有被读取,所以还堆积在缓冲区中,因此,在实际使用中,要在重设状态之前将缓冲区读干净

1.2 cout 和 cin的效率问题

C++的输入输出流缓冲区,与C的输入输出流缓冲区,是两块空间,但是为了做C C++的兼容,它们之间写了一些绑定关系,来保证它们的缓冲区是同步刷新的,防止在同时使用两种语言逻辑时出现的顺序不同步问题。

但是因为存在这种绑定的关系就会造成资源上的消耗,因此当我们在进行算法竞赛或其他需要用到输入输出流,同时还要保证效率的情况下,可以手动进行解绑来提升效率。

下面是解绑的三行代码

​​​​​​​

2. 文件io流

文件中的io流就是 ifstream 和 ofstream,它们的头文件是 <fstream> 它们的继承自istream和ostream,因此接口都是相似的。

​​​​​​​ ​​​​​​​ ​​​​​​​

使用的时候ofstream用来写文件,ifstream用来读文件,文件可以直接在对象构造的时候进行打开,也可以手动 .open,关闭的话也不用手动 .close 因为是对象管理的文件,因此在出声明周期析构的时候会自动进行析构关闭文件。

3. 内存io流

所谓内存io流就是把数据先都流插入到一个string字符串中备用,需要的时候通过 .str() 查看存储了哪些临时内容。

其中我们要使用到的就是 ostringstream 和 istringstream ,它们的头文件是 <sstream>

可以看到我们将 整形i 和 日期类d 都通过重载好的流插入操作存入了对象oss,并且可以通过成员函数访问到我们都往其中存储了什么。

我们也可以使用istringstream进行流提取,取到对应的对象中去。

相关推荐
学步_技术10 分钟前
Python编码系列—Python组合模式:构建灵活的对象组合
开发语言·python·组合模式
o独酌o34 分钟前
递归的‘浅’理解
java·开发语言
Book_熬夜!36 分钟前
Python基础(六)——PyEcharts数据可视化初级版
开发语言·python·信息可视化·echarts·数据可视化
waterHBO1 小时前
R语言 基础笔记
开发语言·笔记·r语言
m0_631270401 小时前
高级c语言(五)
c语言·开发语言
Lenyiin1 小时前
《 C++ 修炼全景指南:十 》自平衡的艺术:深入了解 AVL 树的核心原理与实现
数据结构·c++·stl
2401_858286111 小时前
53.【C语言】 字符函数和字符串函数(strcmp函数)
c语言·开发语言
程序猿练习生2 小时前
C++速通LeetCode中等第5题-无重复字符的最长字串
开发语言·c++·leetcode
2401_858120262 小时前
MATLAB中的无线通信系统部署和优化工具有哪些
开发语言·matlab
MATLAB滤波2 小时前
【PSINS】基于PSINS工具箱的EKF+UKF对比程序|三维定位|组合导航|MATLAB
开发语言·matlab