cin stream无限循环,为什么?

时间:2011-07-19 04:56:57

标签: c++

我从c ++编程语言中复制了这个简单的程序,但是我无法按照需要运行它。我错过了什么吗? 基本上,程序将在我点击返回后输出“输入结束”,然后从cin重复输入。它永远不能进入下一个声明。我试图使用向量(下面评论两个语句),相同。试过Vc6和vs2008。

    #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?
}

运行结果:

a b c

输入结束

记录:发生率= 1

记录:b出现= 1

记录:c occurrence = 1

1 2 3

记录:1次出现= 1

记录:2次出现= 1

记录:3次出现= 1

1 个答案:

答案 0 :(得分:5)

istream_iterator将继续,直到它到达流的末尾,而cin通常不会发生。

cin会遇到一个流结束,导致你的语句终止,当它被重定向到一个文件时(当它到达文件末尾时),或者如果它正在接收控制台输入你可以发送按CTRL-Z(Linux上的CTRL-D,iirc)结束流。您可能需要在之后按Enter键。

请注意,cin在执行此操作后将无法使用,因此在此之后您无法读取更多输入。

在遇到流末尾之前,ii将保持有效并继续从流中请求更多数据(在控制台的情况下)。

解决方案是不使用for_each,而是使用手动while循环,当您满足任何条件时,您可以将其打破。