作为成员变量的意外迭代器行为
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
时已经从文件中提取了第一个字符。
我在使用迭代器时遇到问题:
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
时已经从文件中提取了第一个字符。