05/01/2020
IO拆分就是input和output,也就是输入和输出。
声明,定义,应用
//数据类型 + 变量名 = 初始化的值
std::istream& is = std::cin;
std::ostream& os = std::cout;
std::ostream& os = std::cerr;
std::ostream& os = std::clog;
os << "Hello World!\n";
- ostream和istream不能被拷贝,所以使用引用,所以必须绑定初始值。
- 它们也不能被赋值
IO类
因为不是内置数据类型,那基本就是class类了。
- iostream 针对流
- fstream 针对文件
- sstream 针对string
条件状态
IO操作可能发生错误,例如:
char a;
cin >> a; //如果用户给的是数字;cin的状态变成错误状态。
string s;
cin >> s; //一旦发生错误,从上一个a开始就无法进行读入。
cin.clear(); //使流回复正常
如何查询流的状态
iostate是一个类型的constexpr的值。
//流的4种状态 -- 常量值
std::cout << std::cin.badbit<<std::endl; //1
std::cout << std::cin.goodbit<<std::endl;//0
std::cout << std::cin.failbit<<std::endl;//4
std::cout << std::cin.eofbit<<std::endl;//2
//setstate();设置状态
std::cin.setstate(std::cin.badbit);
std::cin.clear(std::cin.eofbit); //clear 也可以设置状态
管理输出缓冲
cout << "Hello world";
每个输出流都管理一个缓冲区,用来保存读写数据。上面的文本串可能可能立即打印出来,但也有可能被操作系统保存在缓冲区,随后再打印。
什么是缓冲刷新
即数据真正写到输出设备或文件,原因有:
- 程序结束,main的return语句结束
- 缓冲区满了,需要刷新缓冲,新的内容才能写入
- endl可以显示的刷新缓冲区
- unitbuf设置流的内部状态
std::cout << unitbuf;//后面所有输出刷新缓冲区
std::cout << nonunitbuf;//回复正常的缓冲模式
- 一个输出流可以关联到另一个流。一般cin和cerr关联到cout,因此当你使用cin,cout的会被刷新。
cin.tie(&cout);//cin关联到cout
ostream *old_tie = cin.tie(nullptr);//cin不再与其他流关联在一起。
文件输入输出
问题1: 文件流对象open两次文件,有什么后果?
第一次文件打开成功,建立关联,但是第二次文件流调用open失败,failbit被置位,随后使用文件流的操作都会失败。所以记得一定要关闭文件。
自动构造和析构
当一个fstream对象被销毁时,close会自动调用,比如离开作用域的局部变量。
文件模式
- in 读文件打开
- out 以写方式打开,会清空原有的内容,如果不想配合app使用。
- app 每次写操作前均定位到文件末尾
- ate 打开文件后立即定位大文件末尾
- trunc 截断文件
- binary 以二进制方式进行IO
string流
辅助getline或者整合string的
C++ primer 第五版 第8章