源自

c++primer 4th, 248页

代码

#include <iostream>
#include <limits>
#include <stdexcept> using namespace std;
int main()
{
int ival;
while(cin >> ival, !cin.eof())
{
cout << "hello:" << cin.fail() << endl;
if(cin.bad())
throw runtime_error("IO stream is corrupted!");
if(cin.fail())
{
cerr << "bad data, try again." << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
continue;
}
}
}

几个地方

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()
{
cin >> val1;
cin.ignore(, '');
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, )
{
cout << "hello " << endl;
cin.clear();
cin.ignore();
}

【c++】流状态的查询和控制的更多相关文章

  1. C++文件操作(输入输出、格式控制、文件打开模式、测试流状态、二进制读写)

    1.向文件写数据 头文件#include <ofstream> ①Create an instance of ofstream(创建ofstream实例) ②Open the file w ...

  2. 从零开始学C++之IO流类库(二):文件流(fstream, ifstream, ofstream)的打开关闭、流状态

    一.文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二.打开文件 说 ...

  3. 文件流(fstream, ifstream, ofstream)的打开关闭、流状态

    一.文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二.打开文件 说 ...

  4. Shell 命令行,实现对若干网站状态批量查询是否正常的脚本

    Shell 命令行,实现对若干网站状态批量查询是否正常的脚本 如果你有比较多的网站,这些网站的运行状态是否正常则是一件需要关心的事情.但是逐一打开检查那简直是一件太糟心的事情了.所以,我想写一个 sh ...

  5. 在数据库各种状态下查询DBID的五大类十种方法汇总

    关于DBID: DBID是DataBase IDentifier的缩写,意思就是数据库的唯一标识符. 这个DBID在数据文件头和控制文件都是存在的,可以用于标示数据文件的归属. 对于不同数据库来说,D ...

  6. 「自己开发直播」rtmp-nginx-module实现直播状态、观看人数控制

    这是自己搭建直播服务器.开发直播平台系列的文章,前面两篇文章分别为: 通过Nginx-rtmp-module搭建直播服务器并实现直播 实现nginx-rtmp-module多频道输入输出与权限控制 这 ...

  7. hdu3605(最大流+状态压缩)

    传送门:Escape 题意:给出每个人适合住的星球信息和该星球能住多少人 ,第一行给出n m 代表有 n 个人 m 个星球,然后接下来n行每行m个数字 1代表适合第 i 个星球 0 代表不适合第 i ...

  8. IO相关1(io类/流状态)

    IO类: iostream 定义了用于读写流的基本类型,fstream 定义了读写命名文件的类型,sstream 定义了读写内存 string 对象的类型. IO 库类型和头文件: 头文件 类型 io ...

  9. http状态--status[查询的资料备注]

    HTTP 状态消息 当浏览器从 web 服务器请求服务时,可能会发生错误. 从而有可能会返回下面的一系列状态消息: 1xx: 信息 消息: 描述: 100 Continue 服务器仅接收到部分请求,但 ...

随机推荐

  1. c#中关于协变性和逆变性(又叫抗变)帮助理解

    今天回忆了之前看的<深入理解C#>这本书中的泛型章节,其中对泛型的可变性的理解.泛型可变性分两种:协变和逆变.逆变也又称为抗变. 怎么理解这两个名词的意思: ①:协变即为在泛型接口类型中使 ...

  2. C#多线程编程实战1.1创建线程

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  3. BP神经网络研究(一)

    本随笔参考文章:<BP神经网络详解与实例>(链接: https://pan.baidu.com/s/1e2niIvD9KtLXEqwXtgdXxw 密码: vb8d) 本随笔原创,转发请注 ...

  4. ES6——let 和 const

    Let 1.使用 Let声明的变量,所声明的变量只在命令所在的代码块内有效. { Let a=1; var b=2; console.log(a) //在代码块里面 可以正常输出a } console ...

  5. windows Win7如何设置多用户同时远程登录

    windows  Win7如何设置多用户同时远程登录 1.创建一个用户 密码永不过期 2.在本地组策略编辑器里面,依次展开计算机配置--->管理模板--->Windows组件---> ...

  6. Open Interface Service WCF三种通信模式

    WCF三种通信模式 一.请求响应模式: 概念:客户端发送请求,一直等待服务端响应,在此期间处于等待(假死)状态:直到服务器响应,才能继续执行其他的操作: 即使返回值是void 也属于请求与答复模式. ...

  7. 牛客网提高组模拟赛第七场 T2 随机生成树

    其实看懂题就很水啦qwq,就是求\(1-N\)的约数啦. 暴力求的话时间复杂度是\(O(NlogN)\)的,其实正解是枚举每个数的倍数......这样的时间复杂度是\(\frac{N}{1}+\fra ...

  8. 食物(矩阵快速幂)(DP)

    这个题..我们可以想到用递推写!!qwq(好吧,其实我的DP水平不高啊qwq) 就是我们以两个为单位(一共九种组合情况),然后往后面推下一位的情况. 通过手动模拟,我们可以找到它们之间的递推关系(详见 ...

  9. UI Automator Viewer的使用

    uiautomatorviewer是android SDK自带的工具.通过截屏并分析XML布局文件的方式,为用户提供控件信息查看服务.该工具位于SDK目录下的tools\bin子目录下.可以看到,它是 ...

  10. css盒子模型基础,margin-top塌陷,元素溢出

    现在布局不用table,一般用盒子模型来布局,也就是通常说的div+css,一个页面就是多个盒子的拼接   一. 初识盒子模型   例子1,测试盒子各属性设置   <head> <s ...