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 (защищенная функция-член) |
Локали |
|
|
[виртуальный] | изменяет связанную локаль (виртуальная защищенная функция-член) |
Позиционирование |
|
|
[виртуальный] | заменяет буфер на массив, определенный пользователем, если разрешено (виртуальная защищенная функция-член) |
|
[виртуальный] | перемещает указатель следующего символа в последовательности ввода, вывода или обоих, используя относительную адресацию (виртуальная защищенная функция-член) |
|
[виртуальный] | перемещает указатель следующего символа в последовательности ввода, вывода или обоих, используя абсолютную адресацию (виртуальная защищенная функция-член) |
|
[виртуальный] | синхронизирует буферы с связанной последовательностью символов (виртуальная защищенная функция-член) |
Область получения |
|
|
[виртуальный] | получает количество символов, доступных для ввода в связанной последовательности ввода, если известно (виртуальная защищенная функция-член) |
|
[виртуальный] | считывает символы из связанной последовательности ввода в область получения (виртуальная защищенная функция-член) |
|
[виртуальный] | считывает символы из связанной последовательности ввода в область получения и перемещает указатель следующего символа (виртуальная защищенная функция-член) |
|
[виртуальный] | считывает несколько символов из последовательности ввода (виртуальная защищенная функция-член) |
| возвращает указатель на начало, текущий символ и конец области получения (защищенная функция-член) |
|
| перемещает указатель следующего символа в последовательности ввода (защищенная функция-член) |
|
| устанавливает указатели начала, следующего и конечного символов последовательности ввода (защищенная функция-член) |
|
Область вывода |
|
|
[virtual] | записывает несколько символов в выходной последовательности (виртуальная защищенная функция-член) |
|
[virtual] | записывает символы в связанную выходную последовательность из области записи (виртуальная защищенная функция-член) |
| возвращает указатель на начало, текущий символ и конец области записи (защищенная функция-член) |
|
| перемещает указатель на следующий символ выходной последовательности (защищенная функция-член) |
|
| перепозиционирует указатели начала, следующего символа и конца выходной последовательности (защищенная функция-член) |
|
Возврат |
|
|
[virtual] | возвращает символ обратно в входную последовательность, возможно, изменяя входную последовательность (виртуальная защищенная функция-член) |
См. также
| тип объекта, способный содержать всю необходимую информацию для управления потоком ввода-вывода C (typedef) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/basic_streambuf