std :: istream_iterator <double>成员变量在递增时失败

时间:2017-04-25 12:25:51

标签: c++ c++11 istream-iterator

我有一个程序如下:

iFrame

执行此程序时,它是核心转储。我知道只有在执行语句#include <iostream> #include <iterator> #include <fstream> #include <string> class Stream{ public: //default constructor Stream(); //constructor Stream(const std::string&); //Returns true if more elements are available bool hasNext(); //Get the next element in the stream double getNext(); private: std::istream_iterator<double> streamHandle; std::istream_iterator<double> eos; }; Stream::Stream() { streamHandle = std::istream_iterator<double>(std::cin); } Stream::Stream(const std::string& absolutePath) { std::fstream file(absolutePath); streamHandle = std::istream_iterator<double>(file); } bool Stream::hasNext() { return (streamHandle != eos)? true: false; } double Stream::getNext() { double value = *streamHandle; ++streamHandle; return value; } int main() { Stream input("test1"); if( input.hasNext()) std::cout << input.getNext(); }

时才会发生这种情况

所以我实现了相同的功能而没有使用如下的类,它工作得很好。

++streamHandle;

请您帮我确定创建课程时出现的问题并从课程中重复#include <iostream> #include <iterator> #include <fstream> #include <string> void readFile(const std::string& absolutePath) { std::fstream file(absolutePath); std::istream_iterator<double> streamHandle = std::istream_iterator<double>(file); std::istream_iterator<double> eos; while( streamHandle != eos) { double val= *streamHandle; ++streamHandle; std::cout << val << "\n"; } } int main() { readFile("test1"); }

1 个答案:

答案 0 :(得分:4)

你的问题真的在于

Stream::Stream(const std::string& absolutePath)
{
        std::fstream file(absolutePath);
        streamHandle = std::istream_iterator<double>(file);
}

在上面的构造函数中,您创建一个本地文件流并将迭代器设置为该文件流。不幸的是,当构造函数退出文件流时会被销毁,这会关闭文件并使迭代器处于无效状态。之后尝试使用该迭代器是未定义的行为并导致核心转储。