IO 库类型和头文件:

头文件        类型

iostream       istream,wistream 从流读取数据

ostream,wostream 向流写入数据

iostream,wiostream 读写流

fstream       ifstream,wifstream 从文件读取数据

ofstream,wofstream 向文件写入数据

fstream,wfstream 读写文件

sstream       istringstream,wistringstream 从 string 读取数据

ostringstream,wostringstream 向 string 写入数据

stringstream,wstringstream 读写 string

条件状态:

strm::iostate   strm是指一种IO类型,iostate是一种机器相关的类型,提供表达条件状态的完整功能。
strm::badbit   标志流已崩溃,致命的输入/输出错误,无法挽回
strm::failbit   标志IO操作失败了,非致命的输入/输出错误,可挽回
strm::eofbit   标志达到文件结尾
strm::goodbit  流未出现错误状态,此值保证为0
s.eof()     若流s的eofbit置位,则返回true
s.fail()     若流s的failbit或badbit置位,则返回true
s.bad()     若流s的badbit置位,则返回true
s.good()    若流s处于有效状态,则返回true
s.clear()    将流的所有条件复位,状态设置为有效,返回void
s.clear(flags)  根据flags标志位,将s中对应条件状态复位,flags类型为strm::iostate。返回void
s.setstate(flags) 根据flags标志位,将s中对应条件状态置位,flags类型为strm::iostate。返回void
s.rdstate()    返回流的当前条件状态,返回类型为strm::iostate

状态位

1.4种条件状态
badbit 用来指出流已经崩溃,属于系统级错误,如不可恢复的读写错误。

failbit 表示一个io操作失败了,比如读取数字却读取的是字符,这是可以恢复的

eofbit 用来表示文件达到文件结尾,这也是可以恢复的

goodbit 表示流的状态正常

注意的是,一但流发生错误,其上后续的io操作都会失败,只有流属于无错状态时,我们才可以用来读取数据,写入数据。

#include<bits/stdc++.h>
using namespace std;
int main(){int a,b;cin>>a;cout<<cin.good()<<endl;//如果流正常返回1cout<<cin.fail()<<endl;  //failbit(输入错误,可以恢复)或者badbit(系统崩溃),则被置位。cout<<cin.rdstate()<<endl;//流正常返回1getchar();cin>>b;//如果上次输入失常,这里就不能使用了。return 0;
}
管理流当前状态
#include<bits/stdc++.h>
using namespace std;
int main(){auto x=cin.rdstate();//rdstate返回当前状态,cin.clear();//将状态恢复(可以在发生了可恢复错误的时候使用)int a;cin>>a;cin.setstate(x);//将cin变成原来状态return 0;
}

检查输入流当前的状态

#include<bits/stdc++.h>
using namespace std;
int main(){int a,b=3;cin>>a;cin>>b;//不可用if(cin.rdstate() == ios::goodbit)cout<<"this input is true"<<endl;else if(cin.rdstate() == ios::failbit)cout<<"输入类型错误,可以通过清除缓冲区挽回、"<<endl;cout<<b<<endl;cin>>b;cout<<b<<endl;return 0;
}
#include <iostream>
using namespace std;
int main(void){int a;cin >> a;cout << cin.rdstate() << endl;cin.clear(ios::goodbit);//使cin有效cout << cin.rdstate() << endl;return 0;
}
管理输出缓冲:

每个输出流都管理一个缓冲区,用来保存程序读写的数据:
os << "please enter a value: ";
文本串可能立即打印出来,也有可能被操作系统保存在缓冲区,随后再打印。
会导致刷新缓冲区的原因:

  • 程序正常结束,作为 main 函数的 return 的一部分,缓冲刷新被执行。
  • 缓冲区满,需要刷新缓冲区,而后新的数据才能写入。
  • 使用操纵符:endl 来显示刷新缓冲区。
  • 每个输出操作后,可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,cerr 是设置 unitbuf 的,因此写到 cerr 中的数据都是立即刷新的。
  • 一个输出流被关联到另一个流,此时,当读写被关联的流时,关联到流的缓冲区会被刷新。默认cin 和 cerr 都关联到 cout,因此读 cin 或写 cerr 都会导致 cout 的缓冲区被刷新。

endl  换行并刷新缓冲区;
ends  插入一个空字符并刷新缓冲区;
flush  仅刷新缓冲区;

#include <iostream>
using namespace std;
int main(void){cout << unitbuf;//所有输出操作后都会立即刷新缓冲区//任何输出都立即刷新,无缓冲for(int i=1;i<=50000;i++)cout<<i;cout << nounitbuf;//回到正常的缓冲方式for(int i=1;i<=50000;i++)cout<<i;//令人疑惑的是为什么两种方式的时间差不多,有时候正常的换缓冲方式更慢。return 0;
}
刷新缓冲区的方式
#include <iostream>
using namespace std;
int main(void){cout<<"ghq"<<ends;//输出空格并刷新缓冲区cout<<"ghq"<<endl;//输出换行并刷新缓冲区cout<<"ghq"<<flush;//刷新缓冲return 0;
}
关联输入和输出流:

当一个输入流关联到一个输出流时,任何试图从输入流读取数据的操纵都会先刷新关联的输出流。标准库将 cout 和 cin 关联到一起,因此:cin >> val;导致 cout 的缓冲区被刷新。

  • tie是将流关联到另一个流的函数,C++中定义如下:
    tie 有两个重载版本:一个版本不带参数,返回指向输出流的指针。如果本对象关联到一个输出流,则返回的就是指向这个流的指针,如果对象未关联到流,则返回空指针。tie 的第二个版本接受一个指向 ostream 的指针,将自己关联到 ostream。即,x.tie(&o) 将流 x 关联到输出流 o。
    我们既可以将一个 istream 对象关联到另一个 ostream,也可以将一个 ostream 关联到另一个 ostream:
#include <iostream>
using namespace std;
int main(void)
{cin.tie(&cerr);//直接将cin由和cout关联改成和cerr关联cin.tie(&cout);//将输入流cin关联到输出流coutostream *old_tie = cin.tie(nullptr);//cin不再与其他流关联cin.tie(&cerr);//将cin关联到cerr,读取cin会刷新cerr而非coutcin.tie(old_tie);//重建cin和cout之间的关联return 0;
}

注意:每个流同时最多关联到一个流,但多个流可以同时关联到一个 ostream。

·
·
·
·
·
靡不有初鲜克有终。

C++ IO流学习笔记相关推荐

  1. Java - IO流学习笔记

    1.文件和文件夹 内存中存放的数据信息在计算机关机后就会消失,如果想要长久的保存数据,就需要使用到光盘.硬盘等设备,为了便于数据的管理以及检索,引入了"文件"的概念.一篇文章,一个 ...

  2. Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter

    Java IO流学习总结四:缓冲流-BufferedReader.BufferedWriter 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/det ...

  3. Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

    Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...

  4. Java IO流学习总结八:Commons IO 2.5-IOUtils

    Java IO流学习总结八:Commons IO 2.5-IOUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/550519 ...

  5. Java IO流学习总结七:Commons IO 2.5-FileUtils

    Java IO流学习总结七:Commons IO 2.5-FileUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/5497 ...

  6. Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream

    Java IO流学习总结六:ByteArrayInputStream.ByteArrayOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ar ...

  7. Java IO流学习总结二:File

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54581478 本文出自[赵彦军的博客] Java IO流学习总结一:输入输出流 J ...

  8. Java IO流学习总结(一)—— IO流分类和常用IO流汇总

    Java IO流学习总结(一)-- IO流分类和常用IO流汇总 IO流的分类: - 按流向分类:输入流.输出流 - 按操作对象分类:字节流.字符流 - 按功能分类:节点流.处理流 IO流的设计模式为装 ...

  9. Redis实现分布式限流(学习笔记

    Redis实现分布式限流(学习笔记2022.07.09) 前言: 以下实现都是基于: spring-boot-starter-web + spring-boot-starter-data-redis ...

  10. Educoder–Java高级特性(第一章)- IO流【笔记+参考代码】

    Educoder–Java高级特性(第一章)- IO流[笔记+参考代码] 第一关 1.下列关于字节和字符的说法正确的是(BC) A.字节 = 字符 + 编码 B.字符 = 字节 + 编码 C.字节 = ...

最新文章

  1. 【Java】判断字符串是否含字母
  2. 在SLES-11-SP1-i586上搭建apache+php环境
  3. Windows服务的安装,启动,停止和卸载
  4. Python语言学习:解决python版本升级问题集合(python2系列→Python3系列)导致错误的总结集合
  5. 如何使用 C# 扩展方法
  6. vba excel 退出编辑状态_偷梁换柱之EXCEL编辑保护和VBA隐藏代码保护的解锁
  7. Redis面试 - redis 都有哪些数据类型?
  8. SQL Server数据库的查询、排序
  9. 接口返回数据太大_Vue实战044:Mockjs模拟服务器Api接口并返回数据详解
  10. MANIFEST.MF
  11. oracle中job的retry次数,Oracle 19c注意事项: DBMS_JOB 行为变化
  12. man时括号里的数字是啥意思
  13. 后缀的形容词_巧记形容词后缀 第二弹
  14. 软件测试肖sir___项目讲解之银行项目
  15. 51单片机延时函数不起作用
  16. 某机主存容量为4Nx16位,且存储字长等于指令字长,若该机指令系统可完成108种操作,操作码位数固定,且具有直接、间接、变址、基址、相对、立即等六种寻址方式
  17. aac格式怎么转换为MP3格式
  18. java 撤销恢复按钮_java文本的撤销和恢复
  19. 嵌入式单片机基础篇(二十七)之Stm32F103单片机给蓝牙模块发送AT指令程序
  20. ARM体系结构(重制版)——九鼎创展 x210V3s

热门文章

  1. loadrunner icrosoft Visual c++2005 sp1运行时组件,就会提示命令行选项语法错误,键入“命令/?”
  2. java怎么编写木马_Java也能写木马~(附源码!)
  3. css3制作梯形,css3实现梯形三角
  4. 【微信小程序】canvas生成分享图片海报模糊解决方法
  5. 使用键盘操作将桌面计算机图标隐藏,如何创建键盘快捷方式来显示或隐藏桌面图标 | MOS86...
  6. 【起航计划ObjC 002】印第安老斑鸠ObjC的幻想 ---- Ubuntu下安装并使用MAC虚拟机
  7. Java stream().filter()筛选出符合条件的数据
  8. Netty03 进阶
  9. WP-2021绿盟杯-藏宝图
  10. 网易云服务器使用https