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进行流提取,取到对应的对象中去。

相关推荐
wheelmouse77886 分钟前
网络排查基础与实战指南:Ping 与 Telnet
开发语言·网络·php
敲代码的嘎仔28 分钟前
Java后端开发——真实面试汇总(持续更新)
java·开发语言·程序人生·面试·职场和发展·八股
U-52184F6931 分钟前
深度解析:从 Qt 的 Q_D 宏说起,C++ 工业级 SDK 是如何保证 ABI 稳定性的
数据库·c++·qt
迈巴赫车主37 分钟前
蓝桥杯20560逃离高塔
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
春日见1 小时前
E2E自驾规控30讲:导论
开发语言·驱动开发·git·matlab·计算机外设
wangchunting1 小时前
Jvm-垃圾收集器
java·开发语言·jvm
沐知全栈开发1 小时前
PHP Math: 精通PHP中的数学函数与应用
开发语言
吴声子夜歌1 小时前
JavaScript——call()、apply()和bind()
开发语言·前端·javascript
平凡灵感码头1 小时前
C语言 printf 数据打印格式速查表
c语言·开发语言·算法
hz_zhangrl2 小时前
CCF-GESP 等级考试 2026年3月认证C++三级真题解析
c++·算法·程序设计·gesp·gesp2026年3月·gesp c++三级