Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ fstream指针未指向_C++_Pointers_Fstream - Fatal编程技术网

C++ 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

我正在尝试创建指向fstream的指针,以便在我的所有类方法中使用它:

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,对付那些无法解释的、不必要的否决票。这是应该做的。来吧。你更清楚。“三原则”。注:还没有否决票。失败:为什么不在指针上使用对象。如果你真的必须使用指针(这是他们这样做的原因),你还必须解释三的规则,否则显然初学者会用其他方式破坏代码。但在大多数情况下,对象更可取。