Класс basic_streambuf
Описывает абстрактный базовый класс для получения буфера потока, который управляет передачей элементов в определенное представление потока и из него.
Синтаксис
template <class Elem, class Tr = char_traits<Elem>>
class basic_streambuf;
Параметры
Elem
Объект char_type.
Tr
Символ traits_type.
Замечания
Шаблон класса описывает абстрактный базовый класс для получения буфера потока, который управляет передачей элементов в определенное представление потока и из нее. Объект класса basic_streambuf
помогает управлять потоком с элементами типа Tr, также известными как char_type, признаки символов которых определяются char_traits класса, также известного как traits_type.
В теории каждый буфер потока управляет двумя независимыми потоками: один для извлечения (ввод) и один для вставки (вывод). Однако конкретное представление может запретить один или оба эти потока. Обычно он поддерживает определенные связи между двумя потоками. То, что вы вставляете в выходной Elem
<поток basic_stringbuf, объекта, Tr
> например, то, что вы позже извлекаете из входного потока. При расположении одного потока basic_filebuf><Elem
Tr
объект размещает другой поток в тандеме.
Общедоступный интерфейс для шаблона basic_streambuf
класса предоставляет операции, которые являются общими для всех буферов потока, однако специализированными. Защищенный интерфейс предоставляет операции, необходимые конкретному представлению потока для выполнения назначенной ему работы. Защищенная виртуальная функция-член позволяет точно настроить поведение производного буфера потока для конкретного представления потока. Каждый производный буфер потока в этой библиотеке описывает, как он специализирует поведение его защищенных виртуальных функций-членов. Поведение по умолчанию для базового класса, которое часто не делает ничего, описано в этой статье.
Оставшиеся защищенные функции-члены управляют копированием в любое хранилище, предоставленное для буферизации операций обмена данными с потоками, и из него. Входной буфер, например, характеризуется следующим:
eback — указатель на начало буфера;
gptr — указатель на следующий элемент для чтения;
egptr, указатель на конец буфера.
Аналогичным образом выходной буфер характеризуется следующим:
pbase — указатель на начало буфера;
pptr — указатель на следующий элемент для записи;
epptr, указатель на конец буфера.
Для любого буфера применяется следующий протокол.
Если следующий указатель имеет значение NULL, буфер не существует. В противном случае все три указателя указывают на одну и ту же последовательность. Их можно безопасно сравнивать с точки зрения порядка.
Если для выходного буфера следующий указатель при сравнении дает значение меньше конечного указателя, можно сохранить элемент в позиции записи, обозначенной следующим указателем.
Если для входного буфера следующий указатель при сравнении дает значение меньше конечного указателя, можно считать элемент в позиции чтения, обозначенной следующим указателем.
Если для входного буфера начальный указатель при сравнении дает значение меньше следующего указателя, можно возвратить элемент в позицию возврата, обозначенную следующим указателем, значение которого уменьшено.
Все защищенные виртуальные функции-члены, которые вы пишете для класса, производных от basic_streambuf
<Elem
, Tr
> должны сотрудничать в обслуживании этого протокола.
Объект класса basic_streambuf
<Elem
хранит Tr
> шесть указателей, описанных ранее. Он также хранит объект языкового стандарта в объекте типа locale, чтобы им при необходимости мог воспользоваться производный буфер потока.
Конструкторы
Конструктор | Description |
---|---|
basic_streambuf | Создает объект типа basic_streambuf . |
Определения типов
Введите имя | Description |
---|---|
char_type | Связывает имя типа с параметром шаблона Elem . |
int_type | Сопоставляет имя типа в области basic_streambuf с параметром шаблона Elem . |
off_type | Сопоставляет имя типа в области basic_streambuf с параметром шаблона Elem . |
pos_type | Сопоставляет имя типа в области basic_streambuf с параметром шаблона Elem . |
traits_type | Связывает имя типа с параметром шаблона Tr . |
Функции элементов
Функция-член | Description |
---|---|
eback | Защищенная функция, возвращающая указатель на начало входного буфера. |
egptr | Защищенная функция, которая возвращает указатель после конца входного буфера. |
epptr | Защищенная функция, которая возвращает указатель в конце выходного буфера. |
gbump | Защищенная функция, которая добавляет count в следующий указатель для входного буфера. |
getloc | Возвращает языковой стандарт объекта basic_streambuf . |
gptr | Защищенная функция, возвращающая указатель на следующий элемент входного буфера. |
imbue | Защищенная виртуальная функция, вызываемая pubimbue. |
in_avail | Возвращает количество элементов, готовых к считыванию из буфера. |
overflow | Защищенная виртуальная функция, которая может вызываться при вставке нового символа в полный буфер. |
pbackfail | Защищенная виртуальная функция-член, которая пытается поместить элемент обратно во входной поток, а затем делает его текущим (на него указывает следующий указатель). |
pbase | Защищенная функция, возвращающая указатель на начало выходного буфера. |
pbump | Защищенная функция, которая добавляет count в следующий указатель для выходного буфера. |
pptr | Защищенная функция, возвращающая указатель на следующий элемент выходного буфера. |
pubimbue | Задает языковой стандарт объекта basic_streambuf . |
pubseekoff | Вызывает seekoff — защищенную виртуальную функцию, которая переопределяется в производном классе. |
pubseekpos | Вызывает seekpos — защищенную виртуальную функцию, которая переопределяется в производном классе, и выполняет сброс текущего положения указателя. |
pubsetbuf | Вызывает setbuf — защищенную виртуальную функцию, которая переопределяется в производном классе. |
pubsync | Вызывает sync — защищенную виртуальную функцию, которая переопределяется в производном классе, и обновляет внешний поток, сопоставленный с данным буфером. |
sbumpc | Считывает и возвращает текущий элемент, перемещая указатель потока. |
seekoff | Защищенная виртуальная функция-член пытается изменить текущие положения управляемых потоков. |
seekpos | Защищенная виртуальная функция-член пытается изменить текущие положения управляемых потоков. |
setbuf | Защищенная виртуальная функция-член выполняет операции, относящиеся непосредственно к каждому производному буферу потока. |
setg | Защищенная функция, которая сохраняет _Gbeg в начальном указателе, _Gnext в следующем указателе и _Gend в конечном указателе для входного буфера. |
setp | Защищенная функция, которая сохраняет _Pbeg в начальном указателе и _Pend в конечном указателе для входного буфера. |
sgetc | Возвращает текущий элемент без изменения положения в потоке. |
sgetn | Возвращает количество считанных элементов. |
showmanyc | Защищенная виртуальная функция-член, которая возвращает количество символов, которые можно извлечь из входного потока. Он также гарантирует, что программа не будет подвергаться неопределенному ожиданию. |
snextc | Считывает текущий элемент и возвращает следующий элемент. |
sputbackc | Помещает char_type в поток. |
sputc | Помещает символ в поток. |
sputn | Помещает строку символов в поток. |
stossc | Переходит за текущий элемент в потоке. |
sungetc | Получает символ из потока. |
swap | Меняет местами значения в этом объекте и значения предоставленного параметра объекта basic_streambuf . |
sync | Защищенная виртуальная функция, которая пытается синхронизировать управляемые потоки с любыми связанными внешними потоками. |
uflow | Защищенная виртуальная функция, которая извлекает текущий элемент из входного потока. |
underflow | Защищенная виртуальная функция, которая извлекает текущий элемент из входного потока. |
xsgetn | Защищенная виртуальная функция, которая извлекает элементы из входного потока. |
xsputn | Защищенная виртуальная функция, которая вставляет элементы в выходной поток. |
Операторы
Operator | Description |
---|---|
operator= | Присваивает значения этому объекту из другого объекта basic_streambuf . |
Требования
Заголовок:<streambuf>
Пространство имен: std
basic_streambuf::basic_streambuf
Создает объект типа basic_streambuf
.
basic_streambuf();
basic_streambuf(const basic_streambuf& right);
Параметры
right
Ссылка lvalue на объект basic_streambuf
, используемый для установки значений для этого объекта basic_streambuf
.
Замечания
Первый защищенный конструктор сохраняет указатель null во всех указателях, управляющих входным и выходным буферами. Он также сохраняет locale::classic
в объекте языкового стандарта. Дополнительные сведения см. в разделе locale::classic.
Второй защищенный конструктор копирует указатели и языковой стандарт справа.
basic_streambuf::char_type
Связывает имя типа с параметром шаблона Elem.
typedef Elem char_type;
basic_streambuf::eback
Защищенная функция, возвращающая указатель на начало входного буфера.
char_type *eback() const;
Возвращаемое значение
Указатель на начало входного буфера.
basic_streambuf::egptr
Защищенная функция, которая возвращает указатель после конца входного буфера.
char_type *egptr() const;
Возвращаемое значение
Указатель в конце входного буфера.
basic_streambuf::epptr
Защищенная функция, которая возвращает указатель в конце выходного буфера.
char_type *epptr() const;
Возвращаемое значение
Указатель в конце выходного буфера.
basic_streambuf::gbump
Защищенная функция, которая добавляет число в следующий указатель для входного буфера.
void gbump(int count);
Параметры
count
Величина, на которую должен переместиться указатель.
basic_streambuf::getloc
Возвращает языковой стандарт объекта basic_streambuf.
locale getloc() const;
Возвращаемое значение
Сохраненный объект языкового стандарта.
Замечания
Дополнительные сведения см. в разделе ios_base::getloc.
Пример
// basic_streambuf_getloc.cpp
// compile with: /EHsc
#include <iostream>
int main( )
{
using namespace std;
cout << cout.rdbuf( )->getloc( ).name( ).c_str( ) << endl;
}
C
basic_streambuf::gptr
Защищенная функция, возвращающая указатель на следующий элемент входного буфера.
char_type *gptr() const;
Возвращаемое значение
Указатель на следующий элемент входного буфера.
basic_streambuf::imbue
Защищенная виртуальная функция, вызываемая объектом pubimbue.
virtual void imbue(const locale& _Loc);
Параметры
_Положение
Ссылка на языковой стандарт.
Замечания
По умолчанию не нужно ничего делать.
basic_streambuf::in_avail
Возвращает количество элементов, готовых к считыванию из буфера.
streamsize in_avail();
Возвращаемое значение
Количество элементов, готовых к считыванию из буфера.
Замечания
Если доступно положение чтения, функция-член возвращает egptr gptr - . В противном случае она возвращает showmanyc.
Пример
// basic_streambuf_in_avail.cpp
// compile with: /EHsc
#include <iostream>
int main( )
{
using namespace std;
char c;
// cin's buffer is empty, in_avail will return 0
cout << cin.rdbuf( )->in_avail( ) << endl;
cin >> c;
cout << cin.rdbuf( )->in_avail( ) << endl;
}
basic_streambuf::int_type
Связывает имя типа в пределах области basic_streambuf с одним из типов в параметре шаблона.
typedef typename traits_type::int_type int_type;
basic_streambuf::off_type
Связывает имя типа в пределах области basic_streambuf с одним из типов в параметре шаблона.
typedef typename traits_type::off_type off_type;
basic_streambuf::operator=
Присваивает значения этому объекту из другого объекта basic_streambuf
.
basic_streambuf& operator=(const basic_streambuf& right);
Параметры
right
Ссылка lvalue на объект basic_streambuf
, используемый для присвоения значений этому объекту.
Замечания
Защищенный оператор-член копируется справа от указателей, которые управляют входным буфером и выходным буфером. Он также сохраняет right.
getloc() в locale object
. Он возвращает *this
.
basic_streambuf::переполнение
Защищенная виртуальная функция, которая может вызываться при вставке нового символа в полный буфер.
virtual int_type overflow(int_type _Meta = traits_type::eof());
Параметры
_Мета
Символ для вставки в буфер, или traits_type::eof.
Возвращаемое значение
Если функция не может завершиться успешно, она возвращает traits_type::eof или создает исключение. В противном случае она возвращает traits_type::not_eof(_ Meta). Поведением по умолчанию является возврат traits_type::eof.
Замечания
Если _Meta не сравнивается с traits_type::eof, функция защищенного виртуального члена пытается вставить элемент traits_type::to_char_type(_Meta) в выходной поток. Для этого существует несколько способов.
Если объект
write position
доступен, можно сохранить элемент в позиции записи и увеличить следующий указатель для выходного буфера.Можно сделать позицию записи доступной, выделяя новое или дополнительное хранилище для выходного буфера.
Можно сделать позицию записи доступной, выписав в какое-либо внешнее место назначения некоторые или все элементы между началом и следующими указателями для выходного буфера.
Функция виртуального переполнения вместе с функциями sync и underflow определяет характеристики класса, производного от streambuf. Каждый производный класс может реализовать переполнение по-разному, но интерфейс с классом вызывающего потока одинаков.
Функция overflow
наиболее часто вызывается общими функциями streambuf
, такими как sputc
и sputn
, когда область put заполнена, но другие классы, включая классы потоков, могут вызывать overflow
в любое время.
Функция использует символы в области put между указателями pbase
и pptr
, а затем повторно инициализирует область put. Функция overflow
также должна использовать nCh
(если nCh
это не EOF
так), или она может выбрать, чтобы поместить этот символ в новую область put, чтобы он использовался при следующем вызове.
Определение использования разное в разных производных классах. Например, класс filebuf
записывает свои символы в файл, а класс strstreambuf
сохраняет их в своем буфере и (если буфер обозначен как динамический) разворачивает этот буфер в ответ на вызов переполнения. Это расширение достигается освобождением старого буфера и его замены на новый буфер большего размера. Указатели настраиваются по необходимости.
basic_streambuf::p backfail
Защищенная виртуальная функция-член, которая пытается поместить элемент обратно во входной поток, а затем делает его текущим (на него указывает следующий указатель).
virtual int_type pbackfail(int_type _Meta = traits_type::eof());
Параметры
_Мета
Символ для вставки в буфер, или traits_type::eof.
Возвращаемое значение
Если функция не может завершиться успешно, она возвращает traits_type::eof или создает исключение. В противном случае возвращается другое значение. Поведением по умолчанию является возврат traits_type::eof.
Замечания
Если _Meta сравнивается с traits_type::eof, элемент для отката фактически является тем, который уже находится в потоке до текущего элемента. В противном случае этот элемент заменяется traits_type::to_char_type(_Meta). Функция может передать элемент обратно различными способами.
Если позиция возврата доступна, функция может сохранить элемент в позиции возврата и уменьшить следующий указатель для входного буфера.
Можно сделать позицию возврата доступной, выделяя новое или дополнительное хранилище для входного буфера.
Для буфера потока с общими входным и выходным потоками можно сделать позицию возврата доступной, выписав в какое-либо внешнее место назначения некоторые или все элементы между началом и следующими указателями для выходного буфера.
basic_streambuf::p base
Защищенная функция, возвращающая указатель на начало выходного буфера.
char_type *pbase() const;
Возвращаемое значение
Указатель на начало выходного буфера.
basic_streambuf::p bump
Защищенная функция, которая добавляет число к следующему указателю для выходного буфера.
void pbump(int count);
Параметры
count
Число символов, на которое следует перенести вперед позицию записи.
basic_streambuf::p os_type
Связывает имя типа в пределах области basic_streambuf с одним из типов в параметре шаблона.
typedef typename traits_type::pos_type pos_type;
basic_streambuf::p ptr
Защищенная функция, возвращающая указатель на следующий элемент выходного буфера.
char_type *pptr() const;
Возвращаемое значение
Указатель на следующий элемент выходного буфера.
basic_streambuf::p ubimbue
Устанавливает языковой стандарт объекта basic_streambuf.
locale pubimbue(const locale& _Loc);
Параметры
_Положение
Ссылка на языковой стандарт.
Возвращаемое значение
Предыдущее значение, хранящееся в объекте языкового стандарта.
Замечания
Функция-член сохраняет _ Loc в объекте языкового стандарта и вызывает imbue.
Пример
Пример, в котором используется pubimbue
, см. в разделе basic_ios::imbue.
basic_streambuf::p ubseekoff
Вызывает seekoff — защищенную виртуальную функцию, которая переопределяется в производном классе.
pos_type pubseekoff(off_type _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Параметры
_От
Позиция, требуемая относительно _Way.
_Способ
Начальная точка для операций смещения. Возможные значения см. в разделе seekdir.
_Который
Задает режим для положения указателя. По умолчанию разрешается изменять позиции чтения и записи.
Возвращаемое значение
Возвращает новую позицию или недопустимую позицию потока (seekoff(_ Off, _Way
) _Which
).
Замечания
Перемещает указатель относительно _Way.
basic_streambuf::p ubseekpos
Вызывает seekpos — защищенную виртуальную функцию, которая переопределяется в производном классе, и выполняет сброс текущего положения указателя.
pos_type pubseekpos(pos_type _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
Параметры
_Sp
Позиция для поиска.
_Который
Задает режим для положения указателя. По умолчанию разрешается изменять позиции чтения и записи.
Возвращаемое значение
Возвращает новую позицию или недопустимую позицию в потоке. Чтобы определить, является ли позиция потока недопустимой, сравните возвращаемое значение с pos_type(off_type(-1))
.
Замечания
Функция-член возвращает seekpos(_ Sp, _Which
).
basic_streambuf::p ubsetbuf
Вызывает setbuf — защищенную виртуальную функцию, которая переопределяется в производном классе.
basic_streambuf<Elem, Tr> *pubsetbuf(
char_type* _Buffer,
streamsize count);
Параметры
_Буфер
Указатель на char_type
для этого экземпляра.
count
Размер буфера.
Возвращаемое значение
Возвращает setbuf(_Buffer
, count
).
basic_streambuf::p ubsync
Вызывает sync — защищенную виртуальную функцию, которая переопределяется в производном классе, и обновляет внешний поток, сопоставленный с данным буфером.
int pubsync();
Возвращаемое значение
Возвращает синхронизацию или -1 в случае сбоя.
basic_streambuf::sbumpc
Считывает и возвращает текущий элемент, перемещая указатель потока.
int_type sbumpc();
Возвращаемое значение
Текущий элемент.
Замечания
Если доступно положение чтения, функция-член возвращает traits_type::to_int_type(*gptr) и увеличивает следующий указатель для входного буфера. В противном случае возвращается uflow.
Пример
// basic_streambuf_sbumpc.cpp
// compile with: /EHsc
#include <iostream>
int main( )
{
using namespace std;
int i = 0;
i = cin.rdbuf( )->sbumpc( );
cout << i << endl;
}
3
33
51
basic_streambuf::seekoff
Защищенная виртуальная функция-член, которая пытается изменить текущие положения управляемых потоков.
virtual pos_type seekoff(
off_type _Off,
ios_base::seekdir _Way,
ios_base::openmode _Which = ios_base::in | ios_base::out);
Параметры
_От
Позиция, требуемая относительно _Way.
_Способ
Начальная точка для операций смещения. Возможные значения см. в разделе seekdir.
_Который
Задает режим для положения указателя. По умолчанию разрешается изменять позиции чтения и записи.
Возвращаемое значение
Возвращает новую позицию или недопустимую позицию потока (seekoff
_ Off, _Way
) _Which
).
Замечания
Новая позиция определяется следующим образом.
Если
_Way
==ios_base::beg
, новая позиция — это начало потока плюс _ Off.Если
_Way
==ios_base::cur
, новая позиция — это текущая позиция в потоке плюс _ Off.Если
_Way
==ios_base::end
, новая позиция — это конец потока плюс _ Off.
Как правило, если which & ios_base::in имеет ненулевое значение, то затрагивается входной поток, а если which & ios_base::out имеет ненулевое значение, затрагивается выходной поток. Однако фактическое использование этого параметра меняется в зависимости от буферов производного потока.
Если функция успешно выполняет изменение позиции или позиций в потоке, она возвращает итоговую позицию в потоке или одну из итоговых позиций в потоке. В противном случае она возвращает недопустимую позицию потока. По умолчанию возвращается недопустимая позиция в потоке.
basic_streambuf::seekpos
Защищенная виртуальная функция-член, которая пытается изменить текущие положения управляемых потоков.
virtual pos_type seekpos(pos_type _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);
Параметры
_Sp
Позиция для поиска.
_Который
Задает режим для положения указателя. По умолчанию разрешается изменять позиции чтения и записи.
Возвращаемое значение
Новая позиция или недопустимая позиция в потоке. Чтобы определить, является ли позиция потока недопустимой, сравните возвращаемое значение с pos_type(off_type(-1))
.
Замечания
Новая позиция — _ Sp.
Как правило, если which & ios_base::in имеет ненулевое значение, то затрагивается входной поток, а если which & ios_base::out имеет ненулевое значение, затрагивается выходной поток. Однако фактическое использование этого параметра меняется в зависимости от буферов производного потока.
Если функция успешно выполняет изменение позиции или позиций в потоке, она возвращает итоговую позицию в потоке или одну из итоговых позиций в потоке. В противном случае она возвращает недопустимую позицию в потоке (–1). По умолчанию возвращается недопустимая позиция в потоке.
basic_streambuf::setbuf
Защищенная виртуальная функция-член выполняет операцию, относящуюся непосредственно к каждому производному буферу потока.
virtual basic_streambuf<Elem, Tr> *setbuf(
char_type* _Buffer,
streamsize count);
Параметры
_Буфер
Указатель на буфер.
count
Размер буфера.
Возвращаемое значение
По умолчанию возвращается this
.
Замечания
См. basic_filebuf. setbuf
предоставляет область памяти для использования объектом streambuf
. Способ использования буфера задается в производных классах.
basic_streambuf::setg
Защищенная функция, которая сохраняет _ Gbeg в начальном указателе, _Gnext
в следующем указателе и _Gend
в конечном указателе для входного буфера.
void setg(char_type* _Gbeg,
char_type* _Gnext,
char_type* _Gend);
Параметры
_Gbeg
Указатель на начало буфера.
_Gnext
Указатель на место посередине буфера.
_Gend
Указатель на конец буфера.
basic_streambuf::setp
Защищенная функция, которая хранит _Pbeg в начальном указателе и _Pend в конечном указателе для выходного буфера.
void setp(char_type* _Pbeg, char_type* _Pend);
Параметры
_Pbeg
Указатель на начало буфера.
_Pend
Указатель на конец буфера.
basic_streambuf::sgetc
Возвращает текущий элемент без изменения положения в потоке.
int_type sgetc();
Возвращаемое значение
Текущий элемент.
Замечания
Если позиция чтения доступна, функция-член возвращает traits_type::to_int_type(*
gptr). В противном случае она возвращает underflow.
Пример
// basic_streambuf_sgetc.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main( )
{
using namespace std;
ifstream myfile( "basic_streambuf_sgetc.txt", ios::in );
char i = myfile.rdbuf( )->sgetc( );
cout << i << endl;
i = myfile.rdbuf( )->sgetc( );
cout << i << endl;
}
basic_streambuf::sgetn
Извлекает до количества символов из входного буфера и сохраняет их в предоставленном буфере ptr.
Этот метод является потенциально опасным, так как зависит от вызывающего объекта при проверке правильности переданных значений.
streamsize sgetn(
char_type* ptr,
streamsize count);
Параметры
ptr
Буфер для хранения извлеченных символов.
count
Количество элементов для чтения.
Возвращаемое значение
Количество считанных элементов. Дополнительные сведения см. в разделе streamsize для получения дополнительных сведений.
Замечания
Функция-член возвращает значение xsgetn(ptr
, count
).
Пример
// basic_streambuf_sgetn.cpp
// compile with: /EHsc /W3
#include <iostream>
#include <fstream>
int main()
{
using namespace std;
ifstream myfile("basic_streambuf_sgetn.txt", ios::in);
char a[10];
// Extract 3 characters from myfile and store them in a.
streamsize i = myfile.rdbuf()->sgetn(&a[0], 3); // C4996
a[i] = myfile.widen('\0');
// Display the size and contents of the buffer passed to sgetn.
cout << i << " " << a << endl;
// Display the contents of the original input buffer.
cout << myfile.rdbuf() << endl;
}
basic_streambuf::showmanyc
Защищенная виртуальная функция-член, которая возвращает количество символов, которые можно извлечь из входного потока, и убедитесь, что программа не будет подвергаться неопределенному ожиданию.
virtual streamsize showmanyc();
Возвращаемое значение
По умолчанию возвращается ноль.
basic_streambuf::snextc
Считывает текущий элемент и возвращает следующий элемент.
int_type snextc();
Возвращаемое значение
Следующий элемент в потоке.
Замечания
Функция-член вызывает sbumpc, и если эта функция возвращает traits_type::eof, то возвращает traits_type::eof. В противном случае она возвращает sgetc.
Пример
// basic_streambuf_snextc.cpp
// compile with: /EHsc
#include <iostream>
int main( )
{
using namespace std;
int i = 0;
i = cin.rdbuf( )->snextc( );
// cout << ( int )char_traits<char>::eof << endl;
cout << i << endl;
}
aa
aa97
basic_streambuf::sputbackc
Помещает char_type в поток.
int_type sputbackc(char_type _Ch);
Параметры
_Ch
Символ.
Возвращаемое значение
Возвращает символ или ошибку.
Замечания
Если позиция обратного размещения доступна и _Ch сравнивается с символом, хранящимся в этой позиции, функция-член уменьшает следующий указатель для входного буфера и возвращает traits_type::to_int_type( _Ch
). В противном случае она возвращает pbackfail(_Ch
).
Пример
// basic_streambuf_sputbackc.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main( )
{
using namespace std;
ifstream myfile("basic_streambuf_sputbackc.txt",
ios::in);
int i = myfile.rdbuf()->sbumpc();
cout << (char)i << endl;
int j = myfile.rdbuf()->sputbackc('z');
if (j == 'z')
{
cout << "it worked" << endl;
}
i = myfile.rdbuf()->sgetc();
cout << (char)i << endl;
}
basic_streambuf::sputc
Помещает символ в поток.
int_type sputc(char_type _Ch);
Параметры
_Ch
Символ.
Возвращаемое значение
Возвращает символ в случае успешного выполнения.
Замечания
write position
Если доступно, функция-член сохраняет _Ch в позиции записи, увеличивает следующий указатель для выходного буфера и возвращает traits_type::to_int_type( _Ch
). В противном случае она возвращает overflow(_Ch
).
Пример
// basic_streambuf_sputc.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main( )
{
using namespace std;
int i = cout.rdbuf( )->sputc( 'a' );
cout << endl << ( char )i << endl;
}
a
a
basic_streambuf::sputn
Помещает строку символов в поток.
streamsize sputn(const char_type* ptr, streamsize count);
Параметры
ptr
Строка символов.
count
Число символов.
Возвращаемое значение
Количество символов, вставленных в поток.
Замечания
Функция-член возвращает xsputn(ptr
, count
). Дополнительные сведения см. в разделе "Примечания" этого члена.
Пример
// basic_streambuf_sputn.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main()
{
using namespace std;
streamsize i = cout.rdbuf()->sputn("test", 4);
cout << endl << i << endl;
}
test
4
basic_streambuf::stossc
Переходит за текущий элемент в потоке.
void stossc();
Замечания
Эта функция-член вызывает sbumpc. Реализация не требуется для предоставления этой функции-члена.
Пример
// basic_streambuf_stossc.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main( )
{
using namespace std;
ifstream myfile( "basic_streambuf_stossc.txt", ios::in );
myfile.rdbuf( )->stossc( );
char i = myfile.rdbuf( )->sgetc( );
cout << i << endl;
}
basic_streambuf::sungetc
Получает символ из потока.
int_type sungetc();
Возвращаемое значение
Возвращает символ или ошибку.
Замечания
Если позиция возврата доступна, функция-член увеличивает следующий указатель для входного буфера и возвращает traits_type::
to_int_type(*
gptr). Однако не всегда можно определить последнее чтение символов, чтобы его можно было записать в состоянии текущего буфера. Если это так, то функция возвращает pbackfail. Чтобы избежать этой ситуации, следите за символом, чтобы вернуть и вызвать sputbackc(ch)
, который не завершится ошибкой, если вы не вызываете его в начале потока, и вы не пытаетесь вернуть несколько символов.
Пример
// basic_streambuf_sungetc.cpp
// compile with: /EHsc
#include <iostream>
#include <fstream>
int main( )
{
using namespace std;
ifstream myfile( "basic_streambuf_sungetc.txt", ios::in );
// Read and increment
int i = myfile.rdbuf( )->sbumpc( );
cout << ( char )i << endl;
// Read and increment
i = myfile.rdbuf( )->sbumpc( );
cout << ( char )i << endl;
// Decrement, read, and do not increment
i = myfile.rdbuf( )->sungetc( );
cout << ( char )i << endl;
i = myfile.rdbuf( )->sungetc( );
cout << ( char )i << endl;
i = myfile.rdbuf( )->sbumpc( );
cout << ( char )i << endl;
}
basic_streambuf::swap
Меняет местами значения в этом объекте и значения предоставленного объекта basic_streambuf
.
void swap(basic_streambuf& right);
Параметры
right
Ссылка lvalue на объект basic_streambuf
, используемый для обмена значений.
Замечания
Защищенные функции-члены обмениваются правом со всеми указателями, контролируемыми input buffer
имиoutput buffer
. Она также выполняет обмен right.
getloc() с объектом locale
.
basic_streambuf::sync
Защищенная виртуальная функция, которая пытается синхронизировать управляемые потоки с любыми связанными внешними потоками.
virtual int sync();
Возвращаемое значение
Если функция не может завершиться успешно, она возвращает значение -1. По умолчанию возвращается ноль.
Замечания
sync
включает запись всех элементов между началом и следующими указателями для выходного буфера. Он не включает возврат элементов между следующими и конечными указателями для входного буфера.
basic_streambuf::traits_type
Связывает имя типа с параметром шаблона Tr.
typedef Tr traits_type;
basic_streambuf::uflow
Защищенная виртуальная функция, которая извлекает текущий элемент из входного потока.
virtual int_type uflow();
Возвращаемое значение
Текущий элемент.
Замечания
Защищенная виртуальная функция-член пытается извлечь текущий элемент ch из входного потока, затем переместить текущую позицию в потоке и возвратить элемент как traits_type::to_int_type(ch). Для этого существует несколько способов.
Если позиция чтения доступна, она принимает ch в качестве элемента, хранящегося в этой позиции чтения, и перемещает вперед следующий указатель для входного буфера.
Она может считывать элемент непосредственно из внешнего источника и доставлять его в качестве значения ch.
Для буфера потока с общими входным и выходным потоками можно сделать позицию чтения доступной, выписав в какое-либо внешнее место назначения некоторые или все элементы между началом и следующими указателями для выходного буфера. Кроме того, можно выделить новое или дополнительное хранилище для входного буфера. Затем эта функция считывает из внешнего источника один или несколько элементов.
Если функция не может завершиться успешно, она возвращает traits_type::eof или создает исключение. В противном случае она возвращает текущий элемент ch
во входном потоке, преобразованный, как описано выше, и перемещает следующий указатель для входного буфера. Поведение по умолчанию — вызов underflow, и, если эта функция возвращает traits_type::eof, возврат traits_type::eof. В противном случае функция возвращает текущий элемент ch во входном потоке, преобразованный, как описано выше, и перемещает следующий указатель для входного буфера.
basic_streambuf::underflow
Защищенная виртуальная функция для извлечения текущего элемента из входного потока.
virtual int_type underflow();
Возвращаемое значение
Текущий элемент.
Замечания
Защищенная виртуальная функция-член пытается извлечь текущий элемент ch из входного потока без перемещения текущей позиции в потоке и возвратить его как traits_type::
to_int_type(ch). Для этого существует несколько способов.
Если позиция чтения доступна, ch — это элемент, хранящийся в позиции чтения. Дополнительные сведения см. в разделе "Примечания" для класса basic_streambuf.
Можно сделать позицию чтения доступной, выделив новое или дополнительное хранилище для входного буфера, а затем считав из внешнего источника один или несколько элементов. Дополнительные сведения см. в разделе "Примечания" для класса basic_streambuf.
Если функция не может завершиться успешно, она возвращает traits_type::
eof()
или создает исключение. В противном случае она возвращает текущий элемент во входном потоке, преобразованный, как описано выше. По умолчанию возвращается traits_type::eof()
.
Виртуальная функция underflow
вместе с функциями sync и overflow задает характеристики класса, производного от streambuf
. Каждый производный класс может реализовать underflow
по-разному, но интерфейс с классом вызывающего потока одинаков.
Функция underflow
наиболее часто вызывается общими функциями streambuf
, такими как sgetc и sgetn, когда область get пустая, но другие классы, включая классы потоков, могут вызывать underflow
в любое время.
Функция underflow
предоставляет область get с символами из источника входных данных. Если область get содержит символы, underflow
возвращает первый символ. Если область get пустая, эта функция заполняет область get и возвращает следующий символ (из оставшихся в области get). Если больше нет доступных символов, то underflow
возвращает EOF
и оставляет область get пустой.
В классе strstreambuf
функция underflow
настраивает указатель egptr для доступа к хранилищу, которое было выделено динамически путем вызова overflow
.
basic_streambuf::xsgetn
Защищенная виртуальная функция, которая извлекает элементы из входного потока.
Этот метод является потенциально опасным, так как зависит от вызывающего объекта при проверке правильности переданных значений.
virtual streamsize xsgetn(
char_type* ptr,
streamsize count);
Параметры
ptr
Буфер для хранения извлеченных символов.
count
Количество элементов для извлечения.
Возвращаемое значение
Количество извлеченных элементов.
Замечания
Функция защищенного виртуального члена извлекает до количества элементов из входного потока, как будто путем повторных вызовов sbumpc и сохраняет их в массиве, начиная с ptr. Он возвращает количество извлеченных элементов.
basic_streambuf::xsputn
Защищенная виртуальная функция, которая вставляет элементы в выходной поток.
virtual streamsize xsputn(const char_type* ptr, streamsize count);
Параметры
ptr
Указатель на вставляемые элементы.
count
Число элементов для вставки.
Возвращаемое значение
Количество элементов, вставленных в поток.
Замечания
Функция защищенного виртуального члена вставляет до количества элементов в выходной поток, как будто путем повторяющихся вызовов sputc из массива, начиная с ptr. Вставка символов в выходной поток останавливается после записи всех символов счетчика или при возврате traits::eof()
вызоваsputc( count)
. Он возвращает количество вставленных элементов.
См. также
Потокобезопасность в стандартной библиотеке C++
Программирование iostream
Соглашения iostreams