Подтвердить что ты не робот

Что такое streambuf? Как его использовать?

Я пытаюсь узнать немного больше о том, как потоки ввода-вывода работают на С++, и я действительно запутался в том, когда использовать что.

Что такое streambuf?
Когда я использую streambuf, по сравнению с string, istream или vector? (Я уже знаю последние три, но не то, как streambuf сравнивается с ними, если это вообще происходит.)

4b9b3361

Ответ 1

Буферы потоков представляют собой входные или выходные устройства и обеспечивают интерфейс низкого уровня для неформатированного ввода-вывода на этом устройстве. С другой стороны, потоки предоставляют оболочку более высокого уровня вокруг буфера посредством основных неформатированных функций ввода-вывода и особенно с помощью форматированных функций ввода-вывода (т.е. Перегрузок operator<< и operator>>). Объекты Stream также могут управлять продолжительностью буфера потока.

Например, поток файлов имеет внутренний буфер потока файлов. Поток управляет временем жизни буфера, и буфер - это то, что обеспечивает фактические возможности чтения и записи файла. Операторы форматирования потока в конечном счете получают доступ к неформатированным функциям ввода-вывода потока, поэтому вам всегда нужно использовать функции ввода-вывода потока и не нужно напрямую касаться функций ввода-вывода буфера.

Другой способ понять различия состоит в том, чтобы взглянуть на различные виды использования, которые они используют для локальных объектов. Потоки используют грани, которые связаны с форматированием, например numpunct и num_get. Вы также можете ожидать, что перегрузки потоков operator<< и operator>> для пользовательских типов данных времени или денег будут использовать графы форматирования времени и денег. Тем не менее, потоковые буферы используют графы codecvt для преобразования между единицами, используемыми их интерфейсом, и байтами. Так, например, интерфейс для basic_streambuf<char16_t> использует char16_t и поэтому basic_streambuf<char16_t> по умолчанию использует codecvt<char16_t, char, mbstate_t> для преобразования отформатированных единиц char16_t, записанных в буфер, в char единицы, записанные на базовое устройство. Таким образом, вы можете видеть, что потоки в основном предназначены для форматирования и потоковых буферов, обеспечивают интерфейс низкого уровня для неформатированного ввода или вывода на устройства, которые могут использовать другое внешнее кодирование.

Вы можете использовать буфер потока, если хотите только неформатированный доступ к устройству ввода-вывода. Вы также можете использовать потоковые буферы, если вы хотите настроить несколько потоков, которые совместно используют буфер потока (хотя вам придется тщательно управлять временем жизни буфера). Будут также специальные потоки потока, которые вы можете использовать, например wbuffer_convert в С++ 11, который выступает в качестве фасада для basic_streambuf<char>, чтобы он выглядел как буфер с широким символьным потоком. Он использует грань codecvt, с которой он сконструирован, вместо того, чтобы использовать грань codecvt, привязанную к любому языку. Обычно вы можете добиться такого же эффекта, просто используя широкополосный буфер, пронизанный локалью, которая имеет соответствующую грань.

Ответ 2

С помощью streambuf мы можем работать на еще более низком уровне. Он позволяет получить доступ к базовым буферам.

Вот несколько хороших примеров: Копировать, загружать, перенаправлять и терять с помощью потоковых файлов С++ и в отношении сравнения. Это может быть полезно,

enter image description here

См. это для более подробной информации: Библиотека IOstream