C++ fstream指针未指向
我正在尝试创建指向fstream的指针,以便在我的所有类方法中使用它:C++ fstream指针未指向,c++,pointers,fstream,C++,Pointers,Fstream,我正在尝试创建指向fstream的指针,以便在我的所有类方法中使用它: class P { private: fstream *fs; public: P() { fstream fs(filepath, openmode); this->fs = &fs; } }; 但它似乎根本没有指向它,例如,如果我写: fs->is_open() fs
class P
{
private:
fstream *fs;
public:
P()
{
fstream fs(filepath, openmode);
this->fs = &fs;
}
};
但它似乎根本没有指向它,例如,如果我写:
fs->is_open()
fs.is_open()
它将返回false,而如果我写:
fs->is_open()
fs.is_open()
它会变成现实
这是什么原因造成的?我还尝试将指针更改为另一个对象,如
fstr
,但这也不起作用。您将成员指针fs
指向一个本地创建的fstream
对象,该对象在其本地作用域结束后不存在,剩下的是一个悬空指针
您的this->fs
现在指向一些不存在的东西
无论何时使用此悬空指针对流进行操作,都会导致未定义的行为要完成要求的操作,您需要使用
新的
操作符,如下所示:
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;
}
SmartIO::SmartIO(常量字符*文件路径,模式)
:fs(NULL)、缓冲区(NULL)、偏移量(0)
{
开关(模式)
{
案例模式::inText:
{
fs=新的fstream(filepath,fstream::in | fstream::ate);
打破
}
案例模式::inBinary:
{
fs=新的fstream(filepath,fstream::in | fstream::binary | fstream::ate);
打破
}
}
如果((fs)&(fs->is_open())
{
buffer=newstd:vector(fs->tellg(),0);
fs->seekg(0,ios::beg);
fs->读取(缓冲区->数据(),缓冲区->大小());
}
其他的
{
printf(“无法打开文件!”);
}
}
SmartIO::~SmartIO()
{
删除财政司司长;
删除缓冲区;
}
您需要动态创建实际的流对象。类似这样的方法可能是:
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
指针。fsteam fs(…)
?请不要手工重新编写代码。请复制并粘贴您实际编写并交给编译器的内容。我们调试一些实际上不存在的东西是没有意义的……如果你打字更仔细一些,事情可能会有所改善fsteam
和fstream
不是一回事。代码未编译:filepath
和openmode
未明显声明。这让我们很难猜到你到底在做什么。+1,对付那些无法解释的、不必要的否决票。这是应该做的。来吧。你更清楚。“三原则”。注:还没有否决票。失败:为什么不在指针上使用对象。如果你真的必须使用指针(这是他们这样做的原因),你还必须解释三的规则,否则显然初学者会用其他方式破坏代码。但在大多数情况下,对象更可取。