Разница между" внутренним "и" связанным " буфером потока

от http://www.cplusplus.com/reference/ios/ios/rdbuf/:

некоторые производные классы потока (такие как stringstream и fstream) поддерживают свои собственные внутренний буфер потока, С которыми они связаны на строительстве. Вызов этой функции для изменения связанный буфер потока не будет иметь никакого влияния на это внутренний буфер потока: поток будет иметь связанный буфер потока что отличается от своего внутренний буфер потока (хотя операции ввода / вывода в потоках всегда используют связанный буфер потока, как возвращено этой функцией-членом).

и далее http://www.cplusplus.com/reference/fstream/ifstream/rdbuf/:

возвращает указатель на внутренний объект filebuf.

обратите внимание, однако, что это не обязательно то же самое, что и в настоящее время связанный буфер потока (возвращается ios:: rdbuf).

Так что внутренний буфер, если он не используется для операций ввода и вывода? И если это означает, что эти две строки могут возвращать два разных объекта, почему это может быть полезно?

std::stringstream ss;
ss.rdbuf();                          // (1) returns "internal" stream buffer?
static_cast<std::ios&>(ss).rdbuf();  // (2) returns "associated" stream buffer?

1 ответов


внутренний буфер используется для операций ввода и вывода до момента вызова rdbuf с другим аргументом. Тогда он просто сидит там.

вы всегда можете повторно включить его, позвонив

stream.basic_ios::rdbuf(stream.rdbuf());

обратите внимание, что внутренний буфер, например,std::fstream всегда std::filebuf объект принадлежит и управляется объектом stream, в то время как связанный буфер может быть любым streambuf производного объекта. Поток хранит только указатель базового класса на него и не управляет его жизнь.

также обратите внимание, что термин "внутренний буфер" не используется стандартом. В стандарте используется немного другая терминология:

класс basic_ifstream<charT, traits> поддерживает чтение из имени файлов. Он использует basic_filebuf<charT, traits> объект для управления последовательностью. Для наглядности сохраненные данные представлены здесь в виде:

- sb на