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);
}
在上面的构造函数中,您创建了一个本地文件流并将迭代器设置为它。不幸的是,当构造函数退出时,文件流被破坏,从而关闭文件并使迭代器处于无效状态。之后尝试使用该迭代器是未定义的行为并导致核心转储。
我有一个程序如下:
#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);
}
在上面的构造函数中,您创建了一个本地文件流并将迭代器设置为它。不幸的是,当构造函数退出时,文件流被破坏,从而关闭文件并使迭代器处于无效状态。之后尝试使用该迭代器是未定义的行为并导致核心转储。