使用相同的流对象写入文件流或字符串流

时间:2019-04-12 00:43:13

标签: c++ fstream stringbuffer sstream filebuf

我正在尝试使用ostream对象将其写入基于字符串流的用户输入的文件流(类似于Linux中的fmemopen)。

我意识到ostream不会采用stringstream或fstream对象,而是采用stringbug或filebuf。

我尝试了以下代码:

    char content[] = "This is a test";
    if (isFile)
    {
        filebuf fp;
        fp.open(filename, ios::out);
        ostream os(&fp);
        os << content;
        fp.close();
    }
    else
    {
        stringbuf str;
        ostream os(&str);
        os << content;
    }

在if else条件下,此方法工作正常,但我想在if else条件之外将ostream os用作os << content。但是问题是我无法全局定义ostream os,因为没有用于ostream的此类构造函数。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:3)

这可以通过几种不同的方式来处理。

使用助手功能:

void write(ostream &os, const char *content)
{
    os << content
}

...

char content[] = "This is a test";
if (isFile)
{
    ofstream ofs(filename);
    write(ofs, content);
}
else
{
    ostringstream oss;
    write(oss, content);
    string s = oss.str();
    // use s as needed...
}

或者,使用lambda:

char content[] = "This is a test";
auto write = [](ostream &os, const char *content){ os << content; }

if (isFile)
{
    ofstream ofs(filename);
    write(ofs, content);
}
else
{
    ostringstream oss;
    write(oss, content);
    string s = oss.str();
    // use s as needed...
}

使用指针代替:

char content[] = "This is a test";
std::unique_ptr<ostream> os;

if (isFile)
    os = std::make_unique<ofstream>(filename);
else
    os = std::make_unique<ostringstream>();

*os << content;

if (!isFile)
{
    string s = static_cast<ostringstream*>(os.get())->str(); // or: static_cast<ostringstream&>(*os).str()
    // use s as needed...
}