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

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

我有一个程序如下:

#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> 时出了什么问题?来自类(class)。

最佳答案

你的问题真的出在

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

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

关于c++ - std::istream_iterator<double> 成员变量在递增时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43610621/

相关文章:

c++ - 将 boost IOStreams 与 std::ostream_iterator 结合使用

c++ - Visual Studio 2010 是否执行零初始化?

c++ - C++ 中 *--end() 是什么意思?

c++ - 在 C++ 中实现默认值

c++ - 条件变量 "miss"可以通知调用吗?

c++ - 如何使用 istream_iterator 从 ifstream 读取带空格的字符串?

c++ - 通过 HTTP 请求从站点检索数据(使用 QT5.4 的 C++)

c++ - 使用 fstream 将文件读入单独的变量最有效

c++ - std::unique_lock::try_lock_until() 是否忙等待?

c++ - 为什么所有列表都被填充