IO库设施:
. istream(输入流)类型,提供输入操作。
. ostream(输出流)类型,提供输出操作。
. cin,一个istream对象,从标准输入读取数据。
. cout,一个ostream对象,向标准输出写入数据。
. cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误。
. >>运算符,用来从一个istream对象读取输入数据。
. <<运算符,用来向一个ostream对象写入输出数据。
. getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中。
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
IO库条件状态
strm::iostate strm是一种IO类型。iostate是一种机器相关的类型,提供了表达条件状态的完整功能
strm::badbit 用来指出流已崩溃
strm::failbit 用来指出一个IO操作失败了
strm::eofbit 用来指出流到达了文件结束
strm::goodbit 用来指出流未处于错误状态。此值保证为0
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流的failbit或badbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear() 将流s中所有条件状态复位,将流的状态设置为有效。返回void
s.clear(flags) 根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate。返回void
s.setstate(flags) 根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate。返回void
s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate
查询流的状态
IO库定义了4个iostream类型的constexpr值,表示特定的位模式。这些值用来表示特定类型的IO条件,可以与位运算符一起使用来一次性检测或设置多个标志位。
badbit表示系统级错误,如不可恢复的读写错误。通常情况下,一旦badbit被置位,流就无法再使用了。在发生可恢复错误后,failbit被置位,如期望读取数值却读取了字符等错误。这种问题通常是可以修正的,流还可以继续使用。如果到达文件结束位置,eofbit和failbit都会被置位。goodbit的值为0,表示流还未发生错误。如果badbit、failbit和eofbit任一个被置位,则检测流状态的条件就会失败。
标准库还定义了一组函数来查询这些标志位的状态。操作good在所有错误位均未置位的情况下返回true,而bad,fail和eof则在对应错误位被置位时返回true。此外,在badbit被置位时,fail也会返回true。这意味着,使用good或fail是确定流的总体状态的正确方法。实际上,我们将流当条件使用的代码就等价于!fail()。而eof和bad操作只能表示特定的错误。
管理条件状态
流对象的rdstate成员返回一个iostate值,对应流的当前状态。setstate操作将给定条件位置位,表示发生了对应错误。clear成员是一个重载成员。clear不接受参数的版本复位所有错误标志位。执行clear()后,调用good会返回true。带参数的版本接受一个iostate值,表示流的新状态。为了复位单一的条件状态位,我们首先用rdstate读出当前条件状态,然后用位操作将所需复位来生成新的状态。
例子:
// 复位failbit和badbit,保持其他标志位不变
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit)