您身边的软件定制专家--9年开发经验为您护航

18678812288
0531-88887250

c++流状态的查询和控制

文章作者:济南软件开发 时间:2016年12月20日

1. 逗号表达式
 

 

首先计算每一个操作数,然后返回最右边的操作数最为整个操作的结果,因此while(cin >> ival, !cin.eof())看重的只是!cin.eof(),而对前边的cin>>val不关心。

 

 

2. 条件状态
 

 

流状态由eof, bad, fail, good指示,如果eof, bad, fail任何一个为true那么流监测状态为错误状态;相反都为false,则good为true.

 

其中badbit标志着系统级的故障,是不可回复的,如果流出现这种情况,流通常就不能继续使用了;failbit标志着是可恢复的,可以修正。eofbit在遇到文件结束符时设置,此时还设置了failbit.

 

clear()和setstate()用于改变条件成员的状态。clear()将条件重设为有效状态(eof, bad, fail置为false;good置为true),setstate()把某个特定的流设为有效状态。

 

 

3. cin
 

 

程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入.

 

注意

 

输入结束条件:遇到Enter、Space、Tab键,会把他们读入到输入缓冲区,但是处理的时候会丢弃掉。

 

cin >> val 的返回值是cin, 即左值(同样cout<<val返回左值cout),这样就可以把cin >> val1; cin >> val2 合并为cin>>val1>>val2;

 

 

 

4. ignore函数
 

 

作用:提取输入字符并丢弃他们。

 

函数原型:istream& ignore (streamsize n = 1, int delim = EOF)

 

             读取到前n个字符或在读这n个字符进程中遇到delim字符就停止,把读取的这些东西丢掉。

 

案例:

 

复制代码

#include <iostream>

#include <fstream>

#include <sstream>

#include <limits>

#include <stdexcept>

#include <typeinfo>

 

using namespace std;

 

int main()

{

    int val1, val2;

    while(1)

    {

        cin >> val1;

        cin.ignore(5, '9');

        cin >> val2;

        cout << "val1:" << val1 << endl;

        cout << "val2:" << val2 << endl;

    }

}

复制代码

运行结果

 

 

 

注意:如果读了n个字符,后面这个正好是停止字符,那么都读出来干掉(例子的最后一个)!

 

numeric_limits<streamsize>::max() 此时读取的为最大长度,已经没有界限,只能靠停止符终止。本例中为‘\n’,即从回车后开始读取

 

 

 

5. 为何必须有ignore()函数
 

 

cin.clear()把failbit位清零,但是错误的输入(不是指回车)还是在缓冲区,每次一读错误就做相同的处理,如果没有ignore(),那么当输入错误时,就会无限循环。并且还不是简单的cin.ignore(),默认的为ignore(1, '\n'),这样会导致输入几个错误的字符循环几次,例如

 

    while(cin >> val, 1)

    {

        cout << "hello " << endl;

        cin.clear();

        cin.ignore();

    }

 


想要了解更多详情欢迎来电咨询18678812288
登陆网址:www.jnydkj.cn。
联系人:王经理。