通过istream_iterator获取值后完成cin流

finishing cin stream after getting values by istream_iterator

本文关键字:cin istream iterator 获取 通过      更新时间:2023-10-16

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

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

你的代码本身并没有错。

你只是通过设计获得这种行为。为什么?因为cin默认跳过空白。

正如@Veritas所指出的,你必须发出EOF信号。

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

你为什么要这么做?由于cin默认跳过空白,它如何知道何时停止读取数据?唯一的方法是在数据流中发出信号或输入EOF字符(如上所述)

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

你必须检查是否有换行符,或者你自己发出信号。