Потокові буфери представляють пристрої введення або виведення та забезпечують інтерфейс низького рівня для неформатованого вводу-виводу цього пристрою. Потоки, з іншого боку, забезпечити більш високий рівень обгортки навколо буфера за допомогою основних функцій неформатований введення / виведення і особливо з допомогою відформатованих функцій введення / виводу (тобто, operator<<
і operator>>
перевантаження). Об’єкти потоку також можуть керувати життям буфера потоку.
Наприклад, файловий потік має внутрішній буфер потоку файлів. Потік управляє часом життя буфера, а буфер є тим, що забезпечує фактичні можливості читання та запису у файл. Оператори форматування потоку в кінцевому підсумку отримують доступ до неформатованих функцій вводу-виводу буфера потоку, тому вам доведеться лише використовувати функції вводу-виводу потоку, і вам не потрібно безпосередньо торкатися функцій вводу-виводу буфера.
Інший спосіб зрозуміти відмінності - поглянути на різні способи використання об’єктів мови. Потоки використовують грані, пов’язані з форматуванням, такими як 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
в C ++ 11, який виконує роль фасаду для, basic_streambuf<char>
щоб зробити його схожим на широкий буфер потоку символів. Він використовує фасет codecvt, з яким він побудований, замість того, щоб використовувати фасет codecvt, прикріплений до будь-якої локалі. Зазвичай ви можете досягти того самого ефекту, просто використовуючи широкий буфер потоку, просякнутий мовою, що має відповідну грань.