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



我的程序如下:

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

您可以帮助我确定创建课程时出了什么问题,并通过班级迭代std::istream_iterator<double>

您的问题确实在于

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

在上面的构造函数中,您创建本地文件流并将迭代器设置为此。不幸的是,当构造函数退出文件流时,将关闭文件并将迭代器留在无效状态下。试图使用迭代器之后是不确定的行为,并导致核心转储。

最新更新