aihot  2020-11-12 09:24:27  OpenCV |   查看评论   
val); ostream& operator<< (double val); ostream& operator<< (long double val); ostream& operator<< (void* val);

除了与在istream流类中声明右移操作符重载函数给出的所有内置类型以外,还增加一个void* 类型,用于输出任何指针(但不能是字符指针,因为它将被作为字符串处理,即输出所指向存储空间中保存的一个字符串)的值。

由于左移操作符重载用于向流中输出表达式的值,所以又称为插入操作符。如当输出流是cout时,则就把表达式的值插入到显示器上,即输出到显示器显示出来。

当系统执行cout<<variable操作时,首先根据x值的类型调用相应的插入操作符重载函数,把variable的值按值传送给对应的形参,接着执行函数体,把variable的值(亦即形参的值)输出到显示器屏幕上,从当前屏幕光标位置起显示出来,然后返回cout流,以便继续使用插入操作符输出下一个表达式的值。

4,IO条件状态

4.1 查询流的状态

IO操作都有可能发生错误,一些错误是可恢复的,而其他错误发生在系统深处,已经超出了赢咖4平台可以修正的范围。

IO类定义了一些函数和标志,可以帮助我们访问和操纵流的条件状态。

首先表示一个流当前的状态的变量的类型为strm::iostate,其中strm是一种流类型,可以是iostream、fstream等。比如,我们定义一个标准IO流状态:

iostream::iostate strm_state=iostream::goodbit;

IO库存定义了4个iostate类型的contexpr值,表示特定的位模式。这些值用来表示特定类型的IO条件,可以与位运算一起使用来一次性检测或设置多个标志位。

1)strm::badbit用来指定流已崩溃。它表示系统级的错误,如不可恢复的读写错误。通常情况下,一旦badbit被置位,流就无法再使用了。

2)strm::failbit用来指出一个IO操作失败了。

3)strm::eofbit用来指出流达了文件的结束。

在发生可恢复错误后,failbit被置位,如期望读取数值却读出一个字符错误。这种问题通常可以修正,流还可以继续使用。如果到达文件结束位置,eofbit和failbit都会被置位。

4)strm::goodbit用来指出流未处于错误状态。此值保证为零。

goodbit的值为0,表示流未发生错误。如果badbit、failbit和eofbit任一个置位,则检测流状态的条件会失败

标准库还定义了一组函数来查询这些标志位的状态,假如s是一个流,那么:

s.eof() // 若流s的eofbit置位,则返回true
s.fail() // 若流s的failbit或badbit置位,则返回true
s.bad() // 若流s的badbit被置位,则返回true
s.good() // 若流s处于有效状态,则返回true

在实际我们在循环中判断流的状态是否有效时,都直接使用流对象本身,比如:while(cin>>variable){cout<<variable},在实际中都转换为了while((cin>>variable).good()){cout<<variable}。

4.2 管理条件状态

IO类库提供了3个函数来管理和设置流的状态:

s.clear(); // 将流s中所有条件状态复位,将流的状态设置为有效,调用good会返回true
s.clear(flags); // 根据给定的flags标志位,将流s中对应的条件状态复位
s.setstate(flags); // 根据给定的flags标志位,将流s中对应的条件状态置位。
s.rdstate(); // 返回一个iostate值,对应流当前的状态。

我们可以这样使用上面的这些成员函数。

iostream::iostate old_state = cin.rdstate(); // 记住cin当前的状态 
cin.clear(); // 使用cin有效 
process_input(cin); // 使用cin 
cin.setstate(old_state); // 将cin置为原有状态 
cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit); // 下failbit和badbit复位,保持eofbit不变。

5,IO缓冲区

5.1 输入缓冲

我们先看一个简单的输入输出程序:

int main()  {      char ch;      while (cin >> ch && ch!='#')      {          cout << ch;      }      return 0;  }

程序的功能是,循环输入字符,然后把输入的字符显式出来,遇到#或cin流失败时结束,按照程序的表面来看,我们想要的效果是输入一个,显示一个,像这样rroonnyy#,红色代表的是显示的结果。而实际中我们的输出与输出却是这样的:

ronny#abc [Enter]

ronny

输入字符立即回显是非缓冲或直接输入的一个形式,它表示你所键入的字符对正在等待的程序立即变为可用。相反,延迟回显是缓冲输入的例子,

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自C++的那些事:流与IO类

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]