zoukankan      html  css  js  c++  java
  • 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语句就是失效的。

    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().

     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 }
  • 相关阅读:
    网易编程题——小易喜欢的单词
    Effective C++ 条款12:复制对象时勿忘其每一个成分
    Effective C++ 条款11:在operator=中处理"自我赋值"
    STM32-通用定时器基本定时功能
    GPIO_Mode
    STM32的ADC编程方法
    STM32的ADC采样与多通道ADC采样
    网络子系统
    linux网络子系统内核分析
    Linux 中高效编写 Bash 脚本的 10 个技巧
  • 原文地址:https://www.cnblogs.com/hubavyn/p/3996413.html
Copyright © 2011-2022 走看看