問題介紹: 程序步驟是開始往容器里面寫數據,以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 }