2011-07-19 25 views
5

私はこの単純なプログラムをC++プログラミング言語からコピーしましたが、希望どおりに動作させることはできません。何か不足していますか? 基本的に、プログラムは "return"を押してから "input end"を出力し、cinからの入力を繰り返します。それは決して次の声明に行くことはできません。私はベクトル(以下の2つのステートメントをコメントしました)を使用しようとしました。 Vc6とvs2008を試してみました。cinストリーム無限ループ、なぜですか?

#include <iostream> 
#include <map> 
#include <algorithm> 
#include <string> 
#include <iterator> 
#include <vector> 
using namespace std; 

map<string, int> histogram; 
void record(const string &s) 
{ 
    histogram[s]++; //this is pretty strange, however it does work! 
    cout<<"recorded:"<<s<<" occurance="<<histogram[s]<<"\n"; 
} 

void print(const pair<const string,int> &r) 
{ 
    cout<<r.first<<' '<<r.second<<'\n'; 
} 

int main() 
{ 
    istream_iterator<string> ii(cin); 
    istream_iterator<string> eos; 
    cout<<"input end\n"; 

    for_each(ii,eos,record); //this statement cannot get out why? It repeats the keyboard input 
    //vector<string> b(ii,eos); 
    //for_each(b.begin(),b.end(),record); 
    for_each(histogram.begin(),histogram.end(),print); //program never comes here why? 
} 

実行結果:

ABC

入力端記録

:のoccurance = 1

記録:のBのoccurance = 1

記録:Cのoccurance = 1

記録:1つのoccurance = 1

記録:2のoccurance = 1

記録:それはストリームの終わりに達するまで3のoccurance = 1

答えて

5

istream_iteratorを続けますcinで通常発生しません。

cin(ファイルの最後に到達したときに)ファイルがリダイレクトされたときにステートメントが終了する原因となるストリームの終わりが発生するか、またはコンソール入力を受信した場合に、 CTRL-Z(Linuxの場合はCTRL-D、iirc)を押してストリームオブストリームを表示します。後でEnterを押す必要があるかもしれません。

この後、cinは使用できなくなるため、その時点以降は入力を読み取ることができません。

ストリームの終わりに達するまで、iiは有効なままで、ストリームからさらに多くのデータを要求し続けます(その場合はコンソール)。

解決策は、for_eachではなく、手動でwhileというループを使用して、必要な条件が満たされたときに中断することができます。

+0

この質問を投稿する前にCtrl-Zを押してみましたが、動作しません。 – shangping

+0

申し訳ありませんが、私はもう一度試しましたが、実際にはenterキーを押してください。ありがとう!私はこの質問について恥ずかしがり屋だ。 – shangping

+0

Ctrl-Z、Enterを押した後にcinを使用可能に戻すことは可能ですか? – Karel

関連する問題