1

我是 C++ 新手,如果这是一个愚蠢的问题,我很抱歉。我似乎无法弄清楚为什么这不起作用。它复制到第一个向量中,并且似乎跳过了第二个复制调用。

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

using namespace std;

int main ()
{
    vector<int> first;
    vector<int> second;

    copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(first));
    cin.clear();
    copy(istream_iterator<int>(cin),istream_iterator<int>(),back_inserter(second)); 
    return 0;
}

我想使用复制函数将 istream_iterator 输入读入任意数量的向量(每个向量一次调用复制)。换句话说:我希望能够在控制台中输入“1 2 3 4 5 ctrl+d”并将 1,2,3,4,5 输入到第一个向量中。然后在控制台中输入“6 7 8 9 10 ctrl+d”并将 6,7,8,9,10 输入到第二个向量中。

问题是,在我在第一个向量中输入一些输入并按 control+d 后,cin 的 istream_iterator 仍然等于 istream_iterator(),无论 cin 的失败状态如何。这会导致每次对“复制”的后续调用都失败(因为 istream_iteratorcin 已经等于程序解释为 eof 的 istream_iterator())。所以我的问题是:我需要做什么来“重置”迭代器以及 cin 流?cin.clear() 确实清除了所有失败位。然而 istream_iterator(cin) 仍然等于 istream_iterator() 无论如何。据我了解,绑定到流的 istream_iterators 仅应在流处于失败状态时等于默认的 istream_iterator 值。我错过了什么?

4

1 回答 1

3

istream_iterator是一个输入迭代器,这意味着您只能取消引用每个迭代器值一次。您实际上是在从流中阅读,并且没有寻找或返回。因此,一旦您到达流的末尾,就没有更多的输入,并且第二个范围是空的。

为什么不直接说vector<int> second(first);复制?


更新:在您澄清问题后,这是一个新的答案:您误解了如何stdin工作。只有一个输入。Ctrl-D不是 C++ 所固有的;相反,这是您平台的约定,当您发出信号时,您的平台将终止输入缓冲区Ctrl-D。之后,输入的“文件”就完成了,不能再往里面写数据了。

不过,您的方法有点不正统。通常,您只需逐行阅读,用 分隔Enter,并对每一行进行标记。使用字符串流,你会得到非常相似的代码:

std::string line;
std::vector<int> first, second;

// Read line 1
if (std::getline(std::cin, line))
{
  std::istringstream iss(line);
  std::copy(std::istream_iterator<int>(iss), std::istream_iterator<int>(), std::back_inserter(first));
}
else { /* error */ }

// Read line 2
if (std::getline(std::cin, line))
{
  std::istringstream iss(line);
  std::copy(std::istream_iterator<int>(iss), std::istream_iterator<int>(), std::back_inserter(second));
}
else { /* error */ }
于 2011-09-15T18:40:47.147 回答