std::basic_streambuf
Определён в заголовочном файле <streambuf> | ||
|---|---|---|
template<
class CharT,
class Traits = std::char_traits<CharT>
> class basic_streambuf;
|
Класс basic_streambuf управляет вводом и выводом символьной последовательности. Он включает в себя и предоставляет доступ к
- управляемой символьной последовательности, также называемой буфером, которая может содержать входную последовательность (также называемую областью чтения) для буферизации операций ввода и/или выходную последовательность (также называемую областью записи) для буферизации операций вывода.
- связанной символьной последовательности, также называемой источником (для ввода) или приёмником (для вывода). Это может быть сущность, доступ к которой осуществляется через API ОС (файл, TCP-сокет, последовательный порт или другое символьное устройство), либо объект (
std::vector, массив, строковый литерал), который можно интерпретировать как источник или приёмник символов.
Объекты потоков ввода-вывода std::basic_istream и std::basic_ostream, а также все производные от них объекты (std::ofstream, std::stringstream и т. д.), реализованы полностью на основе std::basic_streambuf.
Управляемая символьная последовательность представляет собой массив из CharT, который постоянно отображает подпоследовательность или «окно» в связанную символьную последовательность. Его состояние описывается тремя указателями:
- Указатель на начало всегда указывает на наименьший элемент буфера.
- Следующий указатель указывает на элемент, который будет следующим кандидатом для чтения или записи.
- Указатель на конец указывает на позицию сразу за концом буфера.
Объект basic_streambuf может поддерживать ввод (в этом случае буфер, описываемый указателями на начало, следующий и на конец, называется областью чтения), вывод (областью записи) или одновременный ввод и вывод. В последнем случае отслеживаются шесть указателей, которые могут указывать на элементы одного и того же символьного массива или двух отдельных массивов.
Если следующий указатель в области записи меньше указателя на конец, доступна позиция записи. По следующему указателю можно разыменовывать и присваивать значение.
Если следующий указатель в области чтения меньше указателя на конец, доступна позиция чтения. По следующему указателю можно разыменовывать и считывать значение.
Если следующий указатель в области чтения больше указателя на начало, доступна позиция возврата; следующий указатель можно уменьшить, разыменовать и присвоить ему значение, чтобы вернуть символ в область чтения.
Представление и кодировка символов в управляемой последовательности могут отличаться от представления символов в связанной последовательности. В этом случае для преобразования обычно используется фасет локали std::codecvt. Типичный пример — файлы UTF-8 (или файлы с другой многобайтовой кодировкой), доступ к которым осуществляется через объекты std::wfstream: управляемая последовательность состоит из символов wchar_t, а связанная последовательность — из байтов.
Типичная реализация базового класса std::basic_streambuf содержит в качестве полей данных только шесть указателей CharT* и копию std::locale. Кроме того, реализации могут хранить кэшированные копии фасетов локали, которые становятся недействительными при каждом вызове imbue(). Конкретные буферы, такие как std::basic_filebuf или std::basic_stringbuf, являются производными от std::basic_streambuf.
Предусмотрено несколько псевдонимов типов для распространённых символьных типов:
Определён в заголовочном файле <streambuf> |
|
|---|---|
| Тип | Определение |
std::streambuf | std::basic_streambuf<char> |
std::wstreambuf | std::basic_streambuf<wchar_t> |
Типы-члены
| Тип-член | Определение |
|---|---|
char_type |
CharT |
traits_type |
Traits; программа некорректна, если Traits::char_type не является CharT. |
int_type |
Traits::int_type |
pos_type |
Traits::pos_type |
off_type |
Traits::off_type |
Функции-члены
|
[виртуальная] | уничтожает объект basic_streambuf (виртуальная открытая функция-член) |
Локали |
|
изменяет связанную локаль и вызывает imbue() (открытая функция-член) |
|
| получает копию связанной локали (открытая функция-член) |
|
Позиционирование |
|
вызывает setbuf() (открытая функция-член) |
|
вызывает seekoff() (открытая функция-член) |
|
вызывает seekpos() (открытая функция-член) |
|
вызывает sync() (открытая функция-член) |
|
Область чтения |
|
| получает количество символов, непосредственно доступных в области чтения (открытая функция-член) |
|
| продвигает входную последовательность, а затем считывает один символ, не продвигая её повторно (открытая функция-член) |
|
|
(удалена в C++17) | считывает один символ из входной последовательности и продвигает последовательность (открытая функция-член) |
| считывает один символ из входной последовательности, не продвигая её (открытая функция-член) |
|
вызывает xsgetn() (открытая функция-член) |
|
Область записи |
|
| записывает один символ в область записи и продвигает следующий указатель (открытая функция-член) |
|
вызывает xsputn() (открытая функция-член) |
|
Возврат символа |
|
| возвращает один символ во входную последовательность (открытая функция-член) |
|
| сдвигает следующий указатель во входной последовательности на одну позицию назад (открытая функция-член) |
|
Защищённые функции-члены |
|
создаёт объект basic_streambuf (защищённая функция-член) |
|
|
(C++11) | заменяет объект basic_streambuf (защищённая функция-член) |
|
(C++11) | обменивает местами два объекта basic_streambuf (защищённая функция-член) |
Локали |
|
|
[виртуальная] | реагирует на изменение связанной локали (виртуальная защищённая функция-член) |
Позиционирование |
|
|
[виртуальная] | заменяет буфер пользовательским массивом, если это разрешено (виртуальная защищённая функция-член) |
|
[виртуальная] | перемещает следующий указатель во входной последовательности, выходной последовательности или обеих, используя относительную адресацию (виртуальная защищённая функция-член) |
|
[виртуальная] | перемещает следующий указатель во входной последовательности, выходной последовательности или обеих, используя абсолютную адресацию (виртуальная защищённая функция-член) |
|
[виртуальная] | синхронизирует буферы со связанной символьной последовательностью (виртуальная защищённая функция-член) |
Область чтения |
|
|
[виртуальная] | получает, если известно, количество символов, доступных для ввода в связанной входной последовательности (виртуальная защищённая функция-член) |
|
[виртуальная] | считывает символы из связанной входной последовательности в область чтения (виртуальная защищённая функция-член) |
|
[виртуальная] | считывает символы из связанной входной последовательности в область чтения и продвигает следующий указатель (виртуальная защищённая функция-член) |
|
[виртуальная] | считывает несколько символов из входной последовательности (виртуальная защищённая функция-член) |
| возвращает указатели на начало, текущий символ и конец области чтения (защищённая функция-член) |
|
| продвигает следующий указатель во входной последовательности (защищённая функция-член) |
|
| перемещает указатели на начало, следующий элемент и конец входной последовательности (защищённая функция-член) |
|
Область записи |
|
|
[виртуальная] | записывает несколько символов в выходную последовательность (виртуальная защищённая функция-член) |
|
[виртуальная] | записывает символы из области записи в связанную выходную последовательность (виртуальная защищённая функция-член) |
| возвращает указатели на начало, текущий символ и конец области записи (защищённая функция-член) |
|
| продвигает следующий указатель выходной последовательности (защищённая функция-член) |
|
| перемещает указатели на начало, следующий элемент и конец выходной последовательности (защищённая функция-член) |
|
Возврат символа |
|
|
[виртуальная] | возвращает символ во входную последовательность, при необходимости изменяя её (виртуальная защищённая функция-член) |
См. также
| тип объекта, способного хранить всю информацию, необходимую для управления потоком ввода-вывода C (псевдоним типа) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/basic_streambuf