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

std::istream_iterator<double> member variable fails while incrementing

我有一个程序如下:

#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;

时才会发生

所以我在不使用 class 的情况下实现了相同的功能,如下所示,它工作得很好。

#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");
}

您能否帮我确定在创建 class 并从 class.

迭代 std::istream_iterator<double> 时出了什么问题

你的问题真的出在

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

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