使用istream_iterator读取多行中的字符串

时间:2011-08-29 00:12:29

标签: c++ stl

我想阅读以下内容:

Foo 1 2 4 
Bar 3 4 5

作为两个单独的“字符串”对象。

是否可以使用istream_iterator完成此操作?

我在哪里可以找到所有这些迭代器的好文档?

2 个答案:

答案 0 :(得分:3)

您需要使用getline():http://www.cplusplus.com/reference/iostream/istream/getline/

事实是,这正是你想要的。

答案 1 :(得分:2)

我认为你不需要专门使用std::istream_iterator,因为它不会做你想要的。不同的迭代器会对你有用吗?

#include <iterator>
#include <iostream>

class getline_iterator
  : public std::iterator<std::input_iterator_tag, std::string>
{
private:
  std::istream* is;
  std::string line;
  void fetchline() {
    if (is && !std::getline(*is, line)) is = 0;
  }

public:
  getline_iterator(std::istream& is) : is(&is) {
    fetchline();
  }
  getline_iterator() : is(0) { }
  std::string operator*() {
    return line;
  }
  getline_iterator& operator++() {
    fetchline();
    return *this;
  }
  bool operator==(const getline_iterator& rhs) const {
    return (!rhs.is) == (!is);
  }
  bool operator!=(const getline_iterator& rhs) const {
    return !(rhs == *this);
  }
};

int main()
{
  getline_iterator begin(std::cin);
  getline_iterator end;
  std::copy(begin, end, std::ostream_iterator<std::string>(std::cout, "\n"));
}

<小时/> 编辑:我错过了第二个问题:“我在哪里可以找到所有这些迭代器的好文档?”我个人认为http://cplusplus.com/reference/std/iterator/很有用。