Использование одного и того же объекта потока для записи в файловый поток или поток строк - PullRequest
2 голосов
/ 12 апреля 2019

Я пытаюсь использовать объект ostream для записи в поток файлов пользовательского ввода на основе строки (аналогично fmemopen в Linux).

Я понял, что ostream не принимает объекты stringstream или fstream, новместо этого принимает stringbug или filebuf. * ​​1004 *

Я попробовал следующий код:

    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, но я хотел бы использовать ostream os, как os << content вне условия if else.Проблема, однако, в том, что я не могу глобально определить ostream os, поскольку такого конструктора для ostream нет.

Есть ли способ обойти это?

1 Ответ

3 голосов
/ 12 апреля 2019

Это может быть обработано несколькими различными способами.

Использование вспомогательной функции:

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

В качестве альтернативы, использование лямбда-выражения:

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