Что такое streambuf? Как мне его использовать?
Я пытаюсь узнать немного больше о том, как потоки ввода/вывода работают в C++, и я действительно смущен, когда использовать что.
что такое streambuf?
Когда я использую streambuf по сравнению с string, an istream или vector? (Я уже знаю, последние три, но не как streambuf сравнивает с ними, если это вообще.)
2 ответов:
буферы потока представляют устройства ввода или вывода и обеспечивают низкоуровневый интерфейс для неформатированного ввода/вывода на это устройство. Потоки, с другой стороны, обеспечивают обертку более высокого уровня вокруг буфера посредством основных неформатированных функций ввода-вывода и особенно через форматированные функции ввода-вывода (т. е.
operator<<иoperator>>перегрузок). Потоковые объекты также могут управлять временем жизни буфера потока.например, поток файлов имеет внутренний буфер потока файлов. Поток управляет время жизни буфера и буфера-это то, что обеспечивает фактические возможности чтения и записи в файл. Операторы форматирования потока в конечном итоге получают доступ к неформатированным функциям ввода-вывода буфера потока, поэтому вам нужно только использовать функции ввода-вывода потока и не нужно напрямую касаться функций ввода-вывода буфера.
другой способ понять различия заключается в том, чтобы посмотреть на различные виды использования объектов locale. Потоки используют фасеты, связанные с форматированием например,
numpunctиnum_get. Вы также можете ожидать, что перегрузки потокаoperator<<иoperator>>для пользовательских типов данных time или money будут использоваться аспекты форматирования time и money. Однако буферы потока используют фасеты codecvt для преобразования между единицами, используемыми их интерфейсом, и байтами. Так, например, интерфейс дляbasic_streambuf<char16_t>используетchar16_tиbasic_streambuf<char16_t>внутренне используетcodecvt<char16_t, char, mbstate_t>по умолчанию для преобразования форматированныхchar16_tединицы измерения записываются в буферcharединиц записывается на базовое устройство. Таким образом, вы можете видеть, что потоки в основном предназначены для форматирования, а буферы потоков обеспечивают низкоуровневый интерфейс для неформатированного ввода или вывода на устройства, которые могут использовать другое, внешнее кодирование.вы можете использовать буфер потока, когда вам нужен только неформатированный доступ к устройству ввода-вывода. Вы также можете использовать буферы потоков, если вы хотите настроить несколько потоков, которые совместно используют буфер потока (хотя вам придется тщательно управлять временем жизни буфера). Есть также специальные буферы потока можно использовать, например,
wbuffer_convertВ C++11, который действует как фасад дляbasic_streambuf<char>чтобы он выглядел как широкий буфер потока символов. Он использует фасет codecvt, с которым он построен, вместо использования фасета codecvt, прикрепленного к любой локали. Обычно вы можете достичь того же эффекта, просто используя широкий буфер потока, наполненный языковым стандартом, который имеет соответствующий фасет.
С помощью
streambuf, мы можем работать даже нижний уровень. Это позволяет получить доступ к базовым буферам.вот несколько хороших примеров : копирование, загрузка, перенаправление и tee с помощью C++ streambufs и в отношении сравнения, это может быть полезно,
Посмотреть подробнее : Библиотека IOstream

Comments