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

相关推荐
qq_242188633216 分钟前
使用 PyInstaller 打包 Python 脚本为 EXE(教程)
开发语言·python
苦学编程的谢16 分钟前
好运buff机 ------ 测试报告
java·开发语言·功能测试
黎雁·泠崖23 分钟前
Java常用类核心精讲 · 七篇精华总结
java·开发语言
Zevalin爱灰灰29 分钟前
针对汽车工业软件安全性的C语言编码规范——MISRA C
c语言·开发语言·汽车·嵌入式
JienDa29 分钟前
HaiO安装与快速开始
开发语言·php
lightqjx44 分钟前
【C++】C++11 - Lambda表达式+包装器
开发语言·c++·c++11·lambda·包装器
BHXDML1 小时前
操作系统实验:(七)动态分区分配方式的模拟
开发语言·数据库·操作系统
载数而行5201 小时前
算法系列1之最小生成树
c语言·数据结构·c++·算法·贪心算法
额,不知道写啥。1 小时前
HAO的DP
c++·算法·深度优先·动态规划
重生之后端学习1 小时前
208. 实现 Trie (前缀树)
java·开发语言·数据结构·算法·职场和发展·深度优先