C++ IO流学习笔记
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流学习笔记相关推荐
- Java - IO流学习笔记
1.文件和文件夹 内存中存放的数据信息在计算机关机后就会消失,如果想要长久的保存数据,就需要使用到光盘.硬盘等设备,为了便于数据的管理以及检索,引入了"文件"的概念.一篇文章,一个 ...
- Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter
Java IO流学习总结四:缓冲流-BufferedReader.BufferedWriter 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/det ...
- Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream
Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...
- Java IO流学习总结八:Commons IO 2.5-IOUtils
Java IO流学习总结八:Commons IO 2.5-IOUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/550519 ...
- Java IO流学习总结七:Commons IO 2.5-FileUtils
Java IO流学习总结七:Commons IO 2.5-FileUtils 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/5497 ...
- Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream
Java IO流学习总结六:ByteArrayInputStream.ByteArrayOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ar ...
- Java IO流学习总结二:File
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54581478 本文出自[赵彦军的博客] Java IO流学习总结一:输入输出流 J ...
- Java IO流学习总结(一)—— IO流分类和常用IO流汇总
Java IO流学习总结(一)-- IO流分类和常用IO流汇总 IO流的分类: - 按流向分类:输入流.输出流 - 按操作对象分类:字节流.字符流 - 按功能分类:节点流.处理流 IO流的设计模式为装 ...
- Redis实现分布式限流(学习笔记
Redis实现分布式限流(学习笔记2022.07.09) 前言: 以下实现都是基于: spring-boot-starter-web + spring-boot-starter-data-redis ...
- Educoder–Java高级特性(第一章)- IO流【笔记+参考代码】
Educoder–Java高级特性(第一章)- IO流[笔记+参考代码] 第一关 1.下列关于字节和字符的说法正确的是(BC) A.字节 = 字符 + 编码 B.字符 = 字节 + 编码 C.字节 = ...
最新文章
- 【Java】判断字符串是否含字母
- 在SLES-11-SP1-i586上搭建apache+php环境
- Windows服务的安装,启动,停止和卸载
- Python语言学习:解决python版本升级问题集合(python2系列→Python3系列)导致错误的总结集合
- 如何使用 C# 扩展方法
- vba excel 退出编辑状态_偷梁换柱之EXCEL编辑保护和VBA隐藏代码保护的解锁
- Redis面试 - redis 都有哪些数据类型?
- SQL Server数据库的查询、排序
- 接口返回数据太大_Vue实战044:Mockjs模拟服务器Api接口并返回数据详解
- MANIFEST.MF
- oracle中job的retry次数,Oracle 19c注意事项: DBMS_JOB 行为变化
- man时括号里的数字是啥意思
- 后缀的形容词_巧记形容词后缀 第二弹
- 软件测试肖sir___项目讲解之银行项目
- 51单片机延时函数不起作用
- 某机主存容量为4Nx16位,且存储字长等于指令字长,若该机指令系统可完成108种操作,操作码位数固定,且具有直接、间接、变址、基址、相对、立即等六种寻址方式
- aac格式怎么转换为MP3格式
- java 撤销恢复按钮_java文本的撤销和恢复
- 嵌入式单片机基础篇(二十七)之Stm32F103单片机给蓝牙模块发送AT指令程序
- ARM体系结构(重制版)——九鼎创展 x210V3s
热门文章
- loadrunner icrosoft Visual c++2005 sp1运行时组件,就会提示命令行选项语法错误,键入“命令/?”
- java怎么编写木马_Java也能写木马~(附源码!)
- css3制作梯形,css3实现梯形三角
- 【微信小程序】canvas生成分享图片海报模糊解决方法
- 使用键盘操作将桌面计算机图标隐藏,如何创建键盘快捷方式来显示或隐藏桌面图标 | MOS86...
- 【起航计划ObjC 002】印第安老斑鸠ObjC的幻想 ---- Ubuntu下安装并使用MAC虚拟机
- Java stream().filter()筛选出符合条件的数据
- Netty03 进阶
- WP-2021绿盟杯-藏宝图
- 网易云服务器使用https