从cin中读取整型序列并将其存储在vector中

Read a sequence of ints from cin and store them in a vector

本文关键字:存储 vector cin 读取 整型      更新时间:2023-10-16

这是我用std::cin读取整数并将它们存储在一个向量中所做的:

int number; 
vector<int>ivec;
while (cin>>number)
{       
    ivec.push_back(number);
}
for (auto v: ivec){
    cout << v;
}

然后,我遇到了如何停止输入整数并移动到下一个打印向量的过程的问题。

这取决于所使用的终端和精确的机制变化相当大,但通常,键入Ctrl+D (Linux)或Ctrl+Z (Windows)将导致沿管道传输文件结束"信号",导致EOF位被设置在cin上,因此下一个cin >> number尝试失败。

这将打破循环。

很方便的是,如果您从文件重定向输入运行可执行文件,也会发生相同的情况。这才是关键所在

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

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

如果你需要一种方式让用户发出信号:"请继续,但让我稍后输入其他内容",最干净的方式可能是逐行读取cin并使用strtolstringstream解析输入,并比较一个神奇的停止标志(例如空行,"结束")以退出循环。

你可以这样做

#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 );

请找到一个简单的解决方案来解决你的问题,如果你发现这个解决方案有任何问题,请告诉我。

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