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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM