C++中的cin流为什么会产生无限循环?

5

我从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

输入结束

记录:a 出现次数=1

记录:b 出现次数=1

记录:c 出现次数=1

1 2 3

记录:1 出现次数=1

记录:2 出现次数=1

记录:3 出现次数=1

1个回答

5

istream_iterator会一直读取流中的数据,直到遇到流结束符。在cin上通常不会发生这种情况。

cin从文件中读取数据时(到达文件结尾),或者从控制台输入时,你可以通过按下CTRL-Z(Linux上为CTRL-D)来发送流结束符,导致语句终止。之后可能需要按回车键。

请注意,在此之后cin将无法使用,因此您不能在此之后再读取输入。

在遇到流结束符之前,ii将保持有效,并继续从流(在这种情况下是控制台)请求更多数据。

解决方案是不要使用for_each,而是使用手动的while循环,在满足任何条件时都可以退出。


我在发布这个问题之前尝试按下ctrl-Z,但它没有起作用。 - shangping
抱歉,我再试一次,实际上应该在回车后按下ctrl-z。谢谢!我对这个问题感到有些害羞。 - shangping
在按下Ctrl-Z和Enter后,是否有可能使cin恢复可用? - Karel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接