C++ 输入ctrl+z 不能再使用cin的问题

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

源代码如下:

 1 #include<iostream>
 2 #include<map>
 3 #include<string>
 4 #include<vector>
 5 using namespace std;
 6 int main()
 7 {
 8     map<string,vector<int> >my_map;
 9     string word;
10     string word_to_find;
11     vector<int> ivec;
12     while(cin >> word)
13        my_map[word].push_back(0);
14
15     cout << "input a string you want to find:" << endl;
16
17     cin >> word_to_find;
18     map<string,vector<int> >::iterator it = my_map.find(word_to_find);
19     if(it != my_map.end())
20     {
21         vector<int>::iterator it_vec = (it->second).begin();
22         cout << it->first << endl;
23         for(it_vec;it_vec != (it->second).end(); it_vec++)
24             cout << *it_vec << " ";
25         cout << endl;
26     }
27 }

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

我开始的想法是是不是ctrl+Z还是留在缓冲区的,需要刷新缓冲区(清楚数据流)才能重新输入,于是在14行的位置加入cout << endl;发现这是不管用的,经过在网上搜索,发现需要如下解决方案,需要加入cin.clear()和cin.sync().

 1 #include<iostream>
 2 #include<map>
 3 #include<string>
 4 #include<vector>
 5 using namespace std;
 6 int main()
 7 {
 8     map<string,vector<int> >my_map;
 9     string word;
10     string word_to_find;
11     vector<int> ivec;
12     while(cin >> word)
13        my_map[word].push_back(0);
14
15     cin.clear();  // 更改cin的状态标示符
16     cin.sync();  // 清除缓存区的数据流
17     cout << "input a string you want to find:" << endl;
18
19     cin >> word_to_find;
20     map<string,vector<int> >::iterator it = my_map.find(word_to_find);
21     if(it != my_map.end())
22     {
23         vector<int>::iterator it_vec = (it->second).begin();
24         cout << it->first << endl;
25         for(it_vec;it_vec != (it->second).end(); it_vec++)
26             cout << *it_vec << " ";
27         cout << endl;
28     }
29 }
时间: 2024-11-04 20:32:35

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

关于linux后台运行进程如何屏蔽ctrl+z

近日遇到shell后台启动进程,输入ctrl+z被挂起的问题 具体描述如下: 1.现有两个shell脚本,grandfather.sh和father.sh,两个C++程序son1和son2,其中son1为普通程序,son2使用occi连接oracle数据库 调用关系为 2.Father.sh启动son1和son2后,退出到Grandfather.sh,此时在Grandfather.sh中安ctrl+z后,使用ps aux查看son1和son2的进程状态分别为T和S 3.个人认为,既然Father

fg、bg、jobs、&amp;、nohup、ctrl + z命令

一.& 加在一个命令的最后,可以把这个命令放到后台执行,如gftp &, 二.ctrl + z 可以将一个正在前台执行的命令放到后台,并且处于暂停状态,不可执行 三.jobs 查看当前有多少在后台运行的命令 jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated,但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识:也就是说,jobs命令显示的是当前shell环境中所起的后台正在运

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

一.后台进程管理命令 fg.bg.jobs.&.ctrl + z.ctrl + c.ctrl + \.ctrl + d1. &加在一个命令的最后,可以把这个命令放到后台执行 ,如firefox &, 2.ctrl + z可以将一个正在前台执行的命令放到后台,并且处于暂停状态,不可执行 3.jobs查看当前有多少在后台运行的命令jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated,但是如果任务被终止了(kill),sh

linux中bg、fg、ctrl+z、ctrl+d和ctrl+c的区别

fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行 $ pct & 二.ctrl + z 可以将一个正在前台执行的命令挂起三.jobs 查看当前有多少在后台运行的命令 jobs命令执行的结果,+(加号)表示是一个当前的作业,- (减号)表示是一个当前作业之后的一个作业,jobs -l选项可显示所有任务的PID. jobs的状态可以是runn

c++中while(cin&gt;&gt;str)和ctrl z的相关问题探讨

对于while (cin>>str)和ctrl z的问题,网上有以下解释: ------------------------------------------------------------------------------------------------------------------------------ 输入(cin)缓冲是行缓冲.当从键盘上输入一串字符并按回车后,这些字符会首先被送到输入缓冲区中存储.每当按下回车键后,cin就会检测输入缓冲区中是否有了可读的数据. c

linux ctrl+c,ctrl+z,ctrl+d

转自:http://blog.csdn.net/u012787436/article/details/39722583 ctrl+c(中断).ctrl+z(挂起)和ctrl+d(EOF)的区别 ctrl+c:强行中断当前程序的执行.ctrl+z:将任务中断,但是此任务并没有结束,他仍然在进程中,只是放到后台并维持挂起的状态.如需其在后台继续运行,需用"bg 进程号"使其继续运行:再用"fg 进程号"可将后台进程前台化. ctrl+d:表示结束当前输入(即用户不再给当

Linux常用热键(Tab,Ctrl+c,Ctrl+z,Ctrl+d)

Tab [Tab]主要作用有2个: 命令补齐 ① 在命令行下,只需输入例如m,再连续按两次Tab键,系统将列出所有以m开头的命令,(包括自定义的Bshell命令函数),对查找某些记不清楚的命令特有用.例如输入ftp,将查到ftp,ftpcount,ftpwho,ftpshut等本不熟悉的命令. 如:输入scree再按Tab键,scree无相重命令,则自动补齐命令screenfetch. 又如:输入scr后再按Tab后无法自动补齐,是因为出现了相重命令,这时按两次Tab键,则会列出以scr开头的命

ctrl+c,ctrl+d,ctrl+z在linux中意义

fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的一.& 最经常被用到   这个用在一个命令的最后,可以把这个命令放到后台执行二.ctrl + z     可以将一个正在前台执行的命令放到后台,并且暂停三.jobs     查看当前有多少在后台运行的命令四.fg     将后台中的命令调至前台继续运行   如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查

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

ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.ctrl+c是强制中断程序的执行,而ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行.例如:当你vi一个文件是,如果需要用shell执行别的操作,但是你又不打算关闭vi,因为你得存盘推出,你可以简单的按下ctrl+z,shell会将vi进程挂起~,当你结束了那个shell操作之后,