问题介绍: 程序步骤是开始往容器里面写数据,以Ctrl+Z来终止输入流,然后需要输入一个数据,来判断容器中是否有这个数据。

源代码如下:

 #include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;
int main()
{
map<string,vector<int> >my_map;
string word;
string word_to_find;
vector<int> ivec;
while(cin >> word)
my_map[word].push_back(); cout << "input a string you want to find:" << endl; cin >> word_to_find;
map<string,vector<int> >::iterator it = my_map.find(word_to_find);
if(it != my_map.end())
{
vector<int>::iterator it_vec = (it->second).begin();
cout << it->first << endl;
for(it_vec;it_vec != (it->second).end(); it_vec++)
cout << *it_vec << " ";
cout << endl;
}
}

当在第12行输入ctrl+z终止输入流的时候,第17行的cin语句是失效的,应该是ctrl+z(文件结束符)默认程序是不再需要输入的,所以后面的cin语句就是失效的。

cin语句为什么会失效?

显然,直观的感受是ctrl+z引起cin失效。这里牵扯到一个概念:条件状态。IO标准库管理一系列条件状态(condition state)成员,用来标记给定的IO对象是否处于可用状态,或者碰到了哪种特定的错误。

每个IO类定义了三个iostate类型的常量值,分别表示特定的位模式。badbit标志着系统级的故障,如无法恢复的读写错误。如果出现了该类错误,则此流通常不能再用了。如果出现的是可恢复的错误,如在希望获得数值型数据时输入了字符,此时设置failbit标志。eofbit是在遇到文件结束符时设置的,此时同时设置了failbit。流的状态由bad,fail,eof,good操作揭示。任意一个为true,则检查流本身将显示该流处于错误状态。

经检验,运行上述代码,failbit设置为TRUE,而eofbit是为false,按理来说ctrl+z是文件结束符(不太确定),eofbit是为true的。

要使流重新生效,可调用流的clear方法。这里使用cin.clear().

 #include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;
int main()
{
map<string,vector<int> >my_map;
string word;
string word_to_find;
vector<int> ivec;
while(cin >> word)
my_map[word].push_back(); cin.clear(); // 更改cin的状态标示符
cin.sync(); // 清除缓存区的数据流
cout << "input a string you want to find:" << endl; cin >> word_to_find;
map<string,vector<int> >::iterator it = my_map.find(word_to_find);
if(it != my_map.end())
{
vector<int>::iterator it_vec = (it->second).begin();
cout << it->first << endl;
for(it_vec;it_vec != (it->second).end(); it_vec++)
cout << *it_vec << " ";
cout << endl;
}
}

C++ 输入ctrl+z 不能再使用cin的问题的更多相关文章

  1. getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析

    2013-07-18 21:35:58 getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析. char是字符型数 ...

  2. C++ 对Ctrl+Z的解释

    只有当Ctrl+Z单独位于一行的行首时,才表示输入的终止!(即无论何时,都推荐先回车,再Ctrl+Z,再回车结束输入) 当Ctrl+Z位于行中.行末时,输入都不会结束. (Ctrl+Z表示一个字符,其 ...

  3. fg、bg、jobs、&、nohup、ctrl + z命令

    fg.bg.jobs.&.nohup.ctrl + z命令 一.& 加在一个命令的最后,可以把这个命令放到后台执行,如gftp &, 二.ctrl + z 可以将一个正在前台执 ...

  4. Linux后台进程管理以及ctrl+z(挂起)、ctrl+c(中断)、ctrl+\(退出)和ctrl+d(EOF)的区别(转)

    一.后台进程管理命令 fg.bg.jobs.&.ctrl + z.ctrl + c.ctrl + \.ctrl + d1. &加在一个命令的最后,可以把这个命令放到后台执行 ,如fir ...

  5. Linux学习笔记(16)Linux前后台进程切换(fg/bg/jobs/ctrl+z)

    关键词:Linux前后台进程切换,linux进程切换 fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的一.& ...

  6. c++中while(cin>>str)和ctrl z的相关问题探讨

    对于while (cin>>str)和ctrl z的问题,网上有以下解释: -------------------------------------------------------- ...

  7. 关于按下ctrl+z后,之后的cin失效的问题

    下面这代码按下Ctrl+z结束while输入后,接下来的cin >> val2就无法输入了 #include <iostream> #include <vector> ...

  8. C++中标准输入流cin与Ctrl+Z使用时的问题

    今天使用C++编写了一段小程序,练习使用标准库的算法,代码如下: #include <iostream> #include <algorithm> #include <v ...

  9. linux中ctrl+z、ctrl+d和ctrl+c的区别

    ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用f ...

随机推荐

  1. [洛谷P3261][JLOI2015]城池攻占

    题目大意:有$n$个点的树,第$i$个节点有一个权值$h_i$,$m$个骑士,第$i$个骑士攻击力为$v_i$,一个骑士可以把从它开始的连续的父亲中比它小的节点攻破,攻破一个节点可以把攻击力加或乘一个 ...

  2. BZOJ1857:[SCOI2010]传送带——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1857 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送 ...

  3. UVA.455 Periodic Strings(字符串的最小周期)

    Periodic Strings 模板 题意分析 判断字符串的最小周期 代码总览 /* Title:UVA.455 Author:pengwill Date:2016-12-16 */ #includ ...

  4. 【P2602】【ZJOI2012】数字计数

    传送门 Description 给定两个正整数\(a\)和\(b\),求在\([a,b]\)中的所有整数中,每个数码(\(digit\))各出现了多少次. Input 两个正整数\(a,b\) Out ...

  5. ACE_Message_Block功能简介

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/30/607960.html ACE_Message_Block在Ace中用来表示消息的存放空间 ...

  6. oepncv-学习笔记一

    安装opencv文件时若需要cmake编译,如果中间出现 解决办法是: 在opencv的文件中找到包含cmakelist.txt的文件夹,把where is the source code:的路径改成 ...

  7. 数据结构&字符串:可持久化字典树

    利用可持久化Trie树实现范围内取值异或最大值 如果标题没有表达清楚意思,可以看这里的题干: 然后根据异或的性质,异或一个数两次相当于没有异或,那么我们可以维护一个异或前缀和 有了异或前缀和之后我们就 ...

  8. Windows、Linux及Mac查看端口和杀死进程

    本文介绍如何在Windows.Linux及Mac下查看端口和杀死进程. Windows下查看端口和杀死进程 查看占用端口号的进程号:netstat –ano | findstr "指定端口号 ...

  9. MySQL和Postgresql的区别

    一.PostgreSQL相对于MySQL的优势 1.在SQL的标准实现上要比MySQL完善,而且功能实现比较严谨:2.存储过程的功能支持要比MySQL好,具备本地缓存执行计划的能力:3.对表连接支持较 ...

  10. jsp 内置对象(一)

    一.jsp的九大内置对象 内置对象 所属类 pageContext javax.servlet.jsp.PageContext request javax.servlet.http.HttpServl ...