C++学习笔记之基本IO类

  • 理清IO的基本概念

iostream是一个标准库,提供IO机制。

iostream库包含两个类:istreamostream,分别表示输入流和输出流。

一个“流”就是一串长短不定的字符序列,从IO设备读出或写入IO设备,它表达的是随时间推移,字符顺序生成或消耗。

cin是istream的一个对象,cout、cerr、clog是ostream的三个对象。

    • cin(也称标准输入,standard input):程序从cin中读取数据。
    • cout(也称标准输出,standard output):程序向cout写入数据。
    • cerr(也称标准错误,standard error):将程序错误信息写入到cerr中。
    • clog:输出程序运行时的一般性信息。

这些对象都是关联到用户的控制台窗口(console)的:

    • 读取cin,就是从窗口中读入。
    • 向cout、cerr、clog写入,就是向窗口写入。

>>运算符:从一个istream对象(如cin)读取输入数据。

<<运算符:向一个ostream对象(如cout)写入输出数据。

int a;
cin>>a;
cout<<a<<endl;

iostream库还有个getline函数 ,从istream读取一行数据并存入给定的string对象。

string line;
while(getline(cin,line))
    cout<<line<<endl;

需要注意的几点:

  1. 不能拷贝或对IO对象赋值,因为不能拷贝IO对象,所以也不能将形参或者返回类型设置为流类型
  2. 进行IO操作的函数通常以引用方式传递和返回流。
  3. 读写一个IO对象会改变其状态,因此传递和返回的引用不能是const


  • 流的条件状态

一个IO错误的例子:

int ival;
cin>>ival;
如果我们输入的不是数字而是字符,cin会进入错误状态。

正确的做法是在使用一个流之前检查它是否处于良好状态:

while(cin>>ival)
{
    ……
}
但仅将流作为条件使用,我们只能知道流是否有效,而无法知道发生了什么错误,有时候我们需要针对不同的错误采取不同的应对措施。

IO库定义了一个iostate类,提供了表达流状态的完整功能。

流的条件状态如下:

    • badbit:流已崩溃,是系统级错误,一旦被置位,流就无法继续使用。
    • failbit:一个IO操作失败了,这种问题通常可修正,流可继续使用,到达文件结束处该状态也置位。
    • eofbit:流到达了文件结束处。
    • goodbit:流未处于错误状态。

可以把它们理解为一个4位的寄存器,每个状态占一个位,badbit、failbit、eofbit置位时状态有效,而goodbit则是复位时状态有效。

  • 管理条件状态

几个主要函数(s为流,如cin):

    • s.clear():将流s所有条件状态位复位。
    • s.clear(flags):根据flags标志位,将流s中对应条件状态位复位,flags类型为iostate。
    • s.setstate(flags):根据flags标志位,将流s中对应条件状态为置位,flags类型为iostate。
    • s.rdstate():返回流s当前条件状态,返回值类型为iostate。

使用示例:

auto old_state=cin.rdstate();
cin.clear();
//使用cin
process_input(cin);
cin.setstate(old_state);
带参数版本的clear函数使用方法:

cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
上面的代码将failbit位和badbit位置位。


参考资料:《C++ Primer》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值