作为成员变量的意外迭代器行为

Unexpected iterator behavior as a member variable

我在使用迭代器时遇到问题:

class Foo {
 private:
  std::istream_iterator<char> it_;

 public:
  Foo(std::string filepath) {
    std::ifstream file(filepath);
    it_ = std::istream_iterator<char>(file);
  }

  char Next() {
    char c = *it_;
    it_++;
    return c;
  }

  bool HasNext() { return it_ != std::istream_iterator<char>(); }
};

int main() {
  Foo foo("../input.txt");

  while (foo.HasNext()) {
    std::cout << foo.Next();
  }

  std::cout << std::endl;

  return EXIT_SUCCESS;
}

文件 input.txt 只是 Hello, world!

但是当我运行这个时,它只打印H。好像跟把迭代器存为成员变量有关系?

这里:

Foo(std::string filepath) {
    std::ifstream file(filepath);
    it_ = std::istream_iterator<char>(file);
}

您将迭代器存储到 file。一旦此构造函数 returns file 的析构函数被调用,ifstream 的所有迭代器都将失效。它类似于使用指向不再存在的对象的指针。您需要一个 ifstream 来读取,迭代器仅指可以从文件中提取的内容,但是如果文件不存在,您将无法从中提取。也将 ifstream 存储为成员。

您可以读取第一个字符,因为在构建 std::istream_iterator 时已经从文件中提取了第一个字符。