C++ 通过istream_迭代器获取值后完成cin流

C++ 通过istream_迭代器获取值后完成cin流,c++,vector,cin,istream-iterator,C++,Vector,Cin,Istream Iterator,我有一个关于迭代器的简单问题,在下面的代码中,我使用了三种方法从迭代器的指针获取值,并将它们放入标准输出或向量中,但即使按enter键,cin流也是连续的。此代码中的错误应该是什么。。。。提前谢谢 #include <iostream> #include <iterator> #include <vector> using namespace std; int main() { vector<double> My_container

我有一个关于迭代器的简单问题,在下面的代码中,我使用了三种方法从迭代器的指针获取值,并将它们放入标准输出或向量中,但即使按enter键,cin流也是连续的。此代码中的错误应该是什么。。。。提前谢谢

#include <iostream>
#include <iterator>
#include <vector>

using namespace std;

int main()
{

    vector<double> My_container ;

    cout << "Enter values separated by spaces : " ;


#define code1

#ifdef code1

    copy (istream_iterator<double>(cin),
          istream_iterator<double>(),
          ostream_iterator<double>(cout)) ;    

#endif // code


/////////////////////////////////////////////////////
#ifdef code2

    istream_iterator<double> eos ;
    istream_iterator<double> basic_input (cin);    

    while (basic_input != eos)
    {
        My_container.push_back(*basic_input) ;
        ++basic_input ;    
    }

    for (int i = 0 ; i < My_container.size() ; i++)
    {
        cout << i << " :" << My_container.at(i) << endl ;
    }

#endif //code2


//////////////////////////////////////////////
#ifdef code3

    istream_iterator<double> stream_end ;
    istream_iterator<double> basic_input (cin);    

    for ( ; basic_input != stream_end; ++basic_input )
    {
        My_container.push_back(*basic_input) ;
    }

    for (int i = 0 ; i < My_container.size() ; i++)
    {
        cout << i << " :" << My_container.at(i) << endl ;
    }

#endif //code3

}
#包括
#包括
#包括
使用名称空间std;
int main()
{
向量My_容器;

cout您正在等待eof以关闭流。按enter键不行,它只是在流中放入一个换行符


你要么检查换行符,要么自己发eof信号。

你的代码本身并没有错

你得到这种行为完全是出于设计。为什么?因为
cin
默认跳过空白

正如@Veritas所指出的,您必须发出EOF信号。为此:

  • 在Windows上:Ctrl-D(实际上是键入-这不是键盘组合)
  • On*nix:Ctrl-D(实际的键盘组合。从技术上讲,这实际上是一个)

为什么必须这样做?由于默认情况下,
cin
跳过空白,它如何知道何时停止读取数据?唯一的方法是发送信号或输入EOF字符(如上所述)进入数据流。

Ctrl-D在unix系统中不是真的eof。它基本上会刷新输入缓冲区,使迭代器可以立即使用。因此,如果他按Ctrl-D,他应该会看到一些输出,但他仍然处于输入模式。刷新缓冲区后,再次按Ctrl-D将发送0字节,表示eof。@Veritas:谢谢你的评论。你说得很对,我同意。编辑。