1、IO库
(1)、istream(输入流)类型,提供输入操作;
(2)、ostream(输出流)类型,提供输出操作;
(3)、cin,一个istream对象,标准输入流,用来从标准输入读取数据;
(4)、cout,一个ostream对象,标准输出流,从标准输出写入数据,输出可以重定向( “>” 或“1>”)到一个指定文件中;用于将数据写入标准输出,通常用于程序的正常输出内容。
(5)、cerr,一个ostream对象,标准错误流,通常用于输出程序错误信息或与其它不属于正常逻辑的输出内容,写入到标准错误,默认情况下,写到cerr的数据是不缓冲的;错误信息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示;可以通过” 2> ”方式重定向输出到指定文件中;cerr通常用于输出错误信息或其它不属于程序正常逻辑的输出内容。
(6)、clog:一个ostream对象,标准错误流,关联到标准错误;与cerr区别:cerr和clog都是标准错误流,区别在于cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息默认会存放在缓冲区,缓冲区满或者遇到endl时才输出;默认情况下,写到clog的数据是被缓冲的。clog通常用于报告程序的执行信息,存入一个日志文件中。
(7)、>>运算符,用来从一个istream对象读取输入数据;
(8)、<<运算符,用来向一个ostream对象写入输出数据;
(9)、getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中。
2、流中读写数据
- 定义了基于读写流的基本类型
为了支持使用宽字符的语言,标准库定义了一组类型和对象来操纵wchar_t类型的数据。宽字符版本的类型和函数的名字以一个w开始。例如,wcin、wcout和wcerr是分别对应cin、cout和cerr的宽字符版对象。字符版本的类型和对象与其对应的普通char版本的类型定义在同一个头文件中。
2.1 条件状态
iostate: 是一种机器相关的类型
std::cout << "badBit:" << std::cin.badbit<<std::endl; //流崩溃(一般指系统级错误,如不可回复的读写错误) 流不能再继续使用了
std::cout << "failBit:" << std::cin.failbit << std::endl; // (可恢复错误) 流还可以继续使用
std::cout << "eofBit:" << std::cin.eofbit << std::endl;//文件结束位置(eofBit 和 failBit都会被置位)
std::cout << "goodBit:" << std::cin.goodbit << std::endl;//=0 表示流没有问题
std::cout << "bad():" << std::cin.bad() << std::endl; // badBit 位被置位的时候 fail 也会返回错误
std::cout << "fail():" << std::cin.fail() << std::endl;
std::cout << "eof():" << std::cin.eof() << std::endl;
std::cout << "good():" << std::cin.good() << std::endl;
clear // 将流中所有条件状态位复位
clear(flags) // 将流中对应条件位复位
setState(flags) //将流中对应条件位置位 // 设置成1除了good位
rdState //返回流当前条件状态
2.2 输出缓存引出
由于设备的写操作可能很耗时,允许操作系统将多个输出操作组合成单一的设备写操作可以代码很大的性能提升
2.3 导致缓存刷新
- 程序正常结束,作为main函数的return操作的一部分,缓冲刷新执行。
- 缓存区满时。
- 使用endl显示刷新缓存区。
- 再每个输出操作之后,可以使用操作符unitbuf设置流的内部状态,来清空缓存区(cerr是设置unitbuf的)
- 一个输出流可能被关联到另一个流。当读写被关联的流的时候,关联的流被刷新(如cin和cerr都关联到cout,当cin或cerr都会导致cout的缓冲区刷新) x.tie(&o) 将x流关联到输出流o
- endl 输出换行符,刷新缓冲区
- flush 刷新缓冲区
- ends 空格+ 缓冲区
2.4 unibuf 操作符
cout<< unibuf; // 所有输出操作后都会立即刷新缓冲区
cout<< nounitbuf;// 回到正常缓冲方式
2.5 关联输入输出流
任何试图冲输入流中读取数据的操作都会先刷新关联的输出流.标准库的cout和cin关联在一起
cin>> ival; 导致cout的缓冲区被刷新
关联流 :
std::cin.tie(&std::cout);
// old_tie 指向当前关联到的cin的流
std::ostream* old_tie = std::cin.tie(nullptr); // cin不再关联其他流