我正在尝试创建一个指向fstream的指针,因此我可以在所有类方法中使用它:
class P
{
private:
fstream *fs;
public:
P()
{
fstream fs(filepath, openmode);
this->fs = &fs;
}
};
但它似乎并没有指向它,例如我写道:
fs->is_open()
它将返回false,而如果我写:
fs.is_open()
它将返回true。
造成这种情况的原因是什么?我也尝试将指针更改为fstr
之类的指针,但这也没有用。
答案 0 :(得分:4)
您将成员指针fs
指向本地创建的fstream
对象,一旦其本地作用域结束就不存在,您剩下的是一个悬空指针。
您的this->fs
现在指向不存在的内容。
每当您使用此悬空指针对流进行操作时,都会导致未定义行为。
答案 1 :(得分:4)
要完成您的要求,您需要使用new
运算符,如下所示:
SmartIO::SmartIO(const char * filepath , Mode mode)
: fs(NULL), buffer(NULL), offset(0)
{
switch (mode)
{
case Mode::inText:
{
fs = new fstream(filepath,fstream::in|fstream::ate);
break;
}
case Mode::inBinary:
{
fs = new fstream(filepath,fstream::in|fstream::binary|fstream::ate);
break;
}
}
if ((fs) && (fs->is_open()))
{
buffer = new std:vector<char>(fs->tellg(), 0);
fs->seekg(0, ios::beg);
fs->read(buffer->data(), buffer->size());
}
else
{
printf( "cant open the file!");
}
}
SmartIO::~SmartIO()
{
delete fs;
delete buffer;
}
答案 2 :(得分:2)
您需要动态创建实际的流对象。这样的事情可能是一种方法:
class Foo
{
std::istream * p;
bool must_clean;
public:
Foo() : p(nullptr), must_clean(false)
{
if (...) { p = new std::ifstream("somefile.txt"); must_clean = true; }
else if (...) { p = new std::istringstream(global_buf); must_clean = true; }
else { p = &std::cin; }
}
~Foo() { if (must_clean) delete p; }
Foo(Foo const&) = delete;
Foo & operator=(Foo const&) = delete);
};
您可以决定是否需要istream
,ostream
或iostream
指针。