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

Using same stream object to write to filestream or stringstream

我正在尝试使用 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 没有这样的构造函数。

有办法解决这个问题吗?

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

使用辅助函数:

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...
}