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

相关推荐
沐知全栈开发6 分钟前
SVG 文本:深入解析与高效应用
开发语言
张丶大帅11 分钟前
【走进Golang】
开发语言·后端·golang
Sheep Shaun12 分钟前
深入理解红黑树:从概念到完整C++实现详解
java·开发语言·数据结构·c++·b树·算法
楼田莉子14 分钟前
CMake学习:入门及其下载配置
开发语言·c++·vscode·后端·学习
夜月yeyue21 分钟前
VFS (虚拟文件系统) 核心架构
linux·c++·单片机·嵌入式硬件·架构
2501_9445215925 分钟前
Flutter for OpenHarmony 微动漫App实战:列表项组件实现
android·开发语言·javascript·flutter·ecmascript
【赫兹威客】浩哥27 分钟前
【赫兹威客】Redis安装与验证教程
开发语言·php
froginwe1127 分钟前
SVG 简介
开发语言
旭意28 分钟前
数据结构-红黑树和set
数据结构·c++·算法·蓝桥杯
宵时待雨28 分钟前
数据结构(初阶)笔记归纳7:链表OJ
c语言·开发语言·数据结构·笔记·算法·链表