从cin中读取一系列int并将它们存储在向量中

时间:2015-07-14 18:32:46

标签: c++

这是我用cin读取整数并将它们存储在向量中的方法:

int number; 
vector<int>ivec;

while (cin>>number)
{       
    ivec.push_back(number);
}

for (auto v: ivec){

    cout << v;
}

然后,我很难解决如何停止输入整数并转移到下一个打印向量的过程。任何指针将不胜感激。感谢

4 个答案:

答案 0 :(得分:1)

这取决于所使用的终端,并且精确的机制变化很大,但是,通常,键入Ctrl + D(Linux)或Ctrl + Z(Windows)将导致文件结束&#34;信号& #34;沿着管道传输,导致EOF位在cin上设置,从而导致下一次cin >> number尝试失败。

这将打破循环。

方便的是,如果您使用文件中的重定向输入运行可执行文件,则会发生相同的情况。这是重点。

答案 1 :(得分:0)

您发布的代码只要成功就会从cin读取数字。有两种方法可以让它停止成功:如果输入的内容不是数字,则读取数据仍然成功,但将其转换为数字会失败。这会将cin置于错误的状态。它可以使用clear方法恢复。另一种方法是使cin中的字符读取失败(例如,用作输入的文件的结尾)。这会将cin置于failed状态。通常,从失败状态恢复是不可能的。

要在键盘输入数据时生成,您无法再在文件末尾读取状态,必须使用特定于操作系统的方法(可能是Control-D或Control-Z)。这是调用程序的最终结果。

如果您需要一种方式让用户发出信号:“请继续,但让我稍后输入其他内容”,最干净的方式可能是逐行阅读cin并使用解析输入strtolstringstream,并比较魔术停止令牌(例如空行,“结束”)以退出循环。

答案 2 :(得分:0)

您可以通过以下方式执行此操作

#include <vector>
#include <iterator>

//...

vector<int> ivec( std::istream_iterator<int>( std::cin ), 
                  std::istream_iterator<int>() );


for ( auto v: ivec ) std::cout << v << ' ';
std::cout << std::endl;

在Windows中,您必须按下组合Ctrl + z并在UNIX系统中Ctrl + d

或者你可以介绍一个哨兵。在这种情况下,循环可能看起来像

int number; 

const int sentinel = SOME_VALUE;

for ( std::cin >> number && number != sentinel ) vec.push_back( number );

答案 3 :(得分:0)

请找到问题的简单解决方案,如果您发现此解决方案存在任何问题,请与我们联系。

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> va;
    int x;
    while ( cin >> x ) {
          va.push_back(x);
          if ( cin.get() == '\n' ) break;
    }
    //Vector output
    for ( int i = 0; i < va.size(); i++ ) {
        cout << va[i] <<" ";
    }
    return 0;
}