Наличие потока потока сохраняется после разрушения потока? - PullRequest
2 голосов
/ 04 декабря 2010

Возможно ли, чтобы поток streambuf сохранялся после уничтожения уничтожения его исходного потока?

streambuf* f() {
    ifstream my_stream;
    // ...
    return my_stream.rdbuf();
}

void g() {
    streambuf *s = f();
    // ...
    ifstream my_new_stream;
    my_new_stream.rdbuf( s );
}

Т.е. мне нужен указатель на объект streambuf, возвращаемый f() дляостаются в силе даже после того, как my_stream выйдет из области видимости.Через некоторое время я хочу установить для какого-либо другого потока streambuf значение streambuf.

Возможно ли это?Если да, то как?

Ответы [ 2 ]

2 голосов
/ 05 декабря 2010

Это невозможно. std::ifstream создает, владеет и уничтожает свой буфер. Единственная причина, по которой он «экспортируется» через rdbuf, заключается в разрешении перенаправления std::cin и т. Д. В реализации GNU буфер является простым элементом (а не указателем).

std::ifstream не экспортирует элемент rdbuf() с аргументом. Один из его родительских классов делает, но это должно быть затенено переопределением rdbuf в std::basic_ifstream с подписью

std::filebuf *rdbuf() const;

std::filebuf также не подлежит копированию.

(члена rdbuf(std::streambuf *) можно получить, применив std::ios. Использование этого вызовет знакомых носовых демонов.)

1 голос
/ 17 декабря 2013

Чтобы получить то, что вы хотите, создайте и управляйте filebuf / streambuf для себя.Вы можете создавать потоки или потоки в потоковом буфере по мере необходимости.

Как показано ниже:

#include <iostream>
#include <fstream>
#include <memory>
#include <string>

using namespace std;

shared_ptr<streambuf> f()
{
    auto ret = make_shared<filebuf>();
    if( !ret->open("filebuf-test.cpp", ios::in) )
        exit(1);
    return ret;
}

void g(streambuf *sb)
{
    istream is(sb);

    string line;

    while(getline(is, line)) {
        cout << line << '\n';
    }
}

int main()
{
    auto p = f();
    g(p.get());
    return 0;
}
...