Ответ 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, привязанную к любому языку. Обычно вы можете добиться такого же эффекта, просто используя широкополосный буфер, пронизанный локалью, которая имеет соответствующую грань.