namespace std { template <class charT, class traits = char_traits<charT>> class basic_streambuf { public: using char_type = charT; using int_type = typename traits::int_type; using pos_type = typename traits::pos_type; using off_type = typename traits::off_type; using traits_type = traits; virtual ~basic_streambuf(); // [streambuf.locales], locales locale pubimbue(const locale& loc); locale getloc() const; // [streambuf.buffer], buffer and positioning basic_streambuf* pubsetbuf(char_type* s, streamsize n); pos_type pubseekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out); pos_type pubseekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out); int pubsync(); // Get and put areas // [streambuf.pub.get], get area streamsize in_avail(); int_type snextc(); int_type sbumpc(); int_type sgetc(); streamsize sgetn(char_type* s, streamsize n); // [streambuf.pub.pback], putback int_type sputbackc(char_type c); int_type sungetc(); // [streambuf.pub.put], put area int_type sputc(char_type c); streamsize sputn(const char_type* s, streamsize n); protected: basic_streambuf(); basic_streambuf(const basic_streambuf& rhs); basic_streambuf& operator=(const basic_streambuf& rhs); void swap(basic_streambuf& rhs); // [streambuf.get.area], get area access char_type* eback() const; char_type* gptr() const; char_type* egptr() const; void gbump(int n); void setg(char_type* gbeg, char_type* gnext, char_type* gend); // [streambuf.put.area], put area access char_type* pbase() const; char_type* pptr() const; char_type* epptr() const; void pbump(int n); void setp(char_type* pbeg, char_type* pend); // [streambuf.virtuals], virtual functions // [streambuf.virt.locales], locales virtual void imbue(const locale& loc); // [streambuf.virt.buffer], buffer management and positioning virtual basic_streambuf* setbuf(char_type* s, streamsize n); virtual pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out); virtual pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out); virtual int sync(); // [streambuf.virt.get], get area virtual streamsize showmanyc(); virtual streamsize xsgetn(char_type* s, streamsize n); virtual int_type underflow(); virtual int_type uflow(); // [streambuf.virt.pback], putback virtual int_type pbackfail(int_type c = traits::eof()); // [streambuf.virt.put], put area virtual streamsize xsputn(const char_type* s, streamsize n); virtual int_type overflow(int_type c = traits::eof()); }; }
Шаблон класса basic_streambuf служит абстрактным базовым классом для получения различных stream buffers объектов, каждый из которых контролирует два character sequences:
персонаж input sequence;
персонаж output sequence.
basic_streambuf();
Remarks: После getloc() инициализации члена результаты вызова функций-членов локали и полученных таким образом элементов фасетов можно безопасно кэшировать до следующего вызова этого члена imbue .
basic_streambuf(const basic_streambuf& rhs);
~basic_streambuf();
Конструктор по умолчанию защищен для класса, basic_streambuf чтобы гарантировать, что могут быть созданы только объекты для классов, производных от этого класса.
locale pubimbue(const locale& loc);
locale getloc() const;
Returns: Если pubimbue() когда-либо вызывалась, то последнее значение loc предоставлено, в противном случае - текущая глобальная локаль, locale()действующая на момент создания. Если вызван после того, pubimbue() как был вызван, но перед возвратомpubimbue (т. Е. Изнутри вызова imbue()), то он возвращает предыдущее значение.
basic_streambuf* pubsetbuf(char_type* s, streamsize n);
pos_type pubseekoff(off_type off, ios_base::seekdir way,
ios_base::openmode which
= ios_base::in | ios_base::out);
pos_type pubseekpos(pos_type sp,
ios_base::openmode which
= ios_base::in | ios_base::out);
int pubsync();
streamsize in_avail();
Returns: Если позиция чтения доступна, возвращается egptr() - gptr(). В противном случае возвращается showmanyc().
int_type snextc();
Returns: Если эта функция возвращается traits::eof(), возвращается traits::eof(). В противном случае возвращается sgetc().
int_type sbumpc();
Returns: Если позиция чтения входной последовательности недоступна, возвращается uflow(). В противном случае возвращает traits::to_int_type(*gptr()) и увеличивает следующий указатель для входной последовательности.
int_type sgetc();
Returns: Если позиция чтения входной последовательности недоступна, возвращается underflow(). В противном случае возвращается traits::to_int_type(*gptr()).
streamsize sgetn(char_type* s, streamsize n);
int_type sputbackc(char_type c);
Returns: Если позиция возврата входной последовательности недоступна, или если traits::eq(c, gptr()[-1]) есть false, возвращается pbackfail(traits::to_int_type(c)). В противном случае уменьшает следующий указатель входной последовательности и возвращается traits::to_int_type(*gptr()).
int_type sungetc();
int_type sputc(char_type c);
Returns: Если позиция записи выходной последовательности недоступна, возвращается overflow(traits::to_int_type(c)). В противном случае сохраняет c в следующем указателе выходной последовательности, увеличивает указатель на единицу и возвращается traits::to_int_type(c).
streamsize sputn(const char_type* s, streamsize n);
basic_streambuf& operator=(const basic_streambuf& rhs);
void swap(basic_streambuf& rhs);
char_type* eback() const;
char_type* gptr() const;
char_type* egptr() const;
void gbump(int n);
void setg(char_type* gbeg, char_type* gnext, char_type* gend);
char_type* pbase() const;
char_type* pptr() const;
char_type* epptr() const;
void pbump(int n);
void setp(char_type* pbeg, char_type* pend);
void imbue(const locale&);
Remarks: Позволяет производному классу получать информацию об изменениях в локали в момент их возникновения. Между вызовами этой функции класс, производный от streambuf, может безопасно кэшировать результаты вызовов функций локали и членов полученных таким образом фасетов.
basic_streambuf* setbuf(char_type* s, streamsize n);
Effects: Влияет на буферизацию потока способом, который определяется отдельно для каждого класса, производного от basic_streambuf этого пункта ([stringbuf.virtuals], [filebuf.virtuals]).
pos_type seekoff(off_type off, ios_base::seekdir way,
ios_base::openmode which
= ios_base::in | ios_base::out);
Effects: Изменяет позиции потока в одной или нескольких управляемых последовательностях способом, который определяется отдельно для каждого класса, производного от basic_streambuf этого пункта ([stringbuf.virtuals], [filebuf.virtuals]).
pos_type seekpos(pos_type sp,
ios_base::openmode which
= ios_base::in | ios_base::out);
Effects: Изменяет позиции потока в одной или нескольких управляемых последовательностях способом, который определяется отдельно для каждого класса, производного от basic_streambuf этого пункта ([stringbuf], [filebuf]).
int sync();
Effects: Синхронизирует контролируемые последовательности с массивами. То есть, если не pbase() равно нулю, символы между pbase() и pptr() записываются в управляемую последовательность. Затем указатели могут быть при необходимости сброшены.
Returns: -1 при неудаче. Что составляет отказ, определяется каждым производным классом ([filebuf.virtuals]).
streamsize showmanyc();300
Returns: Оценка количества символов, доступных в последовательности, или -1. Если он возвращает положительное значение, то последовательные вызовы underflow() не будут возвращаться traits::eof() до тех пор, пока из потока не будет извлечено хотя бы это количество символов. Если showmanyc() возвращается -1, вызовы underflow() или uflow() завершатся ошибкой.301
streamsize xsgetn(char_type* s, streamsize n);
Effects: Присваивает до n символов последовательным элементам массива, первый элемент которого обозначен s. Назначенные символы считываются из входной последовательности, как если бы при повторных вызовах sbumpc(). Назначение прекращается, когда либо n были назначены символы, либоsbumpc() возвращался вызов traits::eof().
int_type underflow();
Remarks: Открытые члены basic_streambuf вызывают эту виртуальную функцию только в том случае, если она gptr() равна нулю или gptr() >= egptr()
Returns: traits::to_int_type(c), где c является первым character из pending sequence, без перемещения позиции входной последовательности за ним. Если ожидающая последовательность пуста, функция возвращается, traits::eof() чтобы указать на сбой.
Это result character первый символ ожидающей последовательности, если он не пуст, в противном случае - следующий символ, который будет считан из входной последовательности.
Это backup sequence пустая последовательность, если она eback() равна нулю, в противном случае символы в [eback(), gptr()).
Effects: Функция устанавливает gptr() и так egptr() , что если ожидающая последовательность непуста, то не egptr() является нулевой, а символы в [gptr(), egptr()) являются символами в ожидающей последовательности, в противном случае либо gptr() имеет значение null, либо gptr() == egptr().
Если eback() и не gptr() равны нулю, функция не ограничена в отношении их содержимого, но «обычное условие резервного копирования» состоит в том, что либо
резервная последовательность содержит как минимум gptr() - eback() символы, и в этом случае символы [eback(), gptr()) соответствуют последним gptr() - eback() символам резервной последовательности, или
символы [gptr() - n, gptr()) соответствуют резервной последовательности (где n - длина резервной последовательности).
int_type uflow();
Requires: Ограничения те же, что и для underflow(), за исключением того, что символ результата должен быть перенесен из ожидающей последовательности в резервную последовательность, а ожидающая последовательность не должна быть пустой перед передачей.
Default behavior: Звонки underflow(). Если underflow() возвращается traits::eof(), возвращается traits::eof(). В противном случае возвращает значение traits::to_int_type(*gptr()) и увеличивает значение следующего указателя для входной последовательности.
Морфемы слова showmanyc «es-how-many-see», а не «show-manic».
underflow или uflow может потерпеть неудачу из-за преждевременного создания исключения. Намерение состоит не только в том, чтобы звонки не возвращались, eof() но и в том, чтобы они вернулись «немедленно».
Классы, производные от, basic_streambuf могут предоставить более эффективные способы реализации xsgetn() и xsputn() переопределения этих определений из базового класса.
int_type pbackfail(int_type c = traits::eof());
Remarks: Общедоступные функции basic_streambuf вызывают эту виртуальную функцию только тогда, когда возвращается значение gptr() null gptr() == eback(), или . Другие вызовы также должны удовлетворять этому ограничению.traits::eq(traits::to_char_type(c), gptr()[-1])false
pending sequence Определяется как для underflow(), с изменениями , которые
Если traits::eq_int_type(c, traits::eof()) возвращается true, то входная последовательность копируется на один символ до того, как будет определена ожидающая последовательность.
Если traits::eq_int_type(c, traits::eof()) возвращается false, то c добавляется. Не указано, выполняется ли резервная копия входной последовательности или изменяется каким-либо иным образом.
Postconditions: В свою очередь, ограничения gptr(), eback()и pptr() такие же , как для underflow().
Returns: traits::eof() для обозначения отказа. Сбой может произойти из-за невозможности резервного копирования входной последовательности или из-за того, что по какой-либо другой причине указатели не могут быть установлены в соответствии с ограничениями. pbackfail() вызывается только тогда, когда возвращение действительно не удалось.
streamsize xsputn(const char_type* s, streamsize n);
Effects: Записывает до n символов в выходную последовательность, как если бы при повторных вызовах sputc(c). Записанные символы получаются из последовательных элементов массива, первый элемент которого обозначен знаком s. Запись останавливается, когда либо n символы были написаны, либоsputc(c) возвращался вызов traits::eof(). Не указано, вызывает ли функция, overflow() когда pptr() == epptr() становится, true или она достигает тех же результатов другими способами.
int_type overflow(int_type c = traits::eof());
Effects: Использует некоторую начальную подпоследовательность символов pending sequence. Ожидающая последовательность определяется как конкатенация
пустая последовательность, если pbase() не равна нулю, в противном случае pptr() - pbase() символы, начинающиеся с pbase(), за которыми следует
пустая последовательность, если traits::eq_int_type(c, traits::eof()) возвращается true, в противном случае последовательность, состоящая из c.
Remarks: Функции-члены sputc() и sputn() вызывают эту функцию в случае, если в буфере размещения нет места, достаточного для размещения последовательности символов аргумента.
Requires: Каждое преобладающее определение этой виртуальной функции должно подчиняться следующим ограничениям:
1.Указывается влияние употребления символа на связанную выходную последовательность.303
2.Позвольте r быть количеством символов в ожидающей последовательности, которые не используются. Если неr равно нулю , то pbase() и pptr() должен быть установлен таким образом, чтобы: pptr() - pbase() == r а r символы , начинающиеся на pbase() это соответствующий выходной поток. В случае, если он r равен нулю (все символы ожидающей последовательности были израсходованы), то либо pbase() устанавливается nullptr, либо pbase() и pptr() оба установлены на одно и то же ненулевое значение.
3.Функция может завершиться ошибкой, если не удается добавить какой-либо символ в связанный выходной поток или если он не может быть установлен pbase() и в pptr() соответствии с вышеуказанными правилами.
То есть для каждого класса, производного от экземпляра basic_streambuf в этом разделе ([stringbuf], [filebuf]), дается спецификация того, как потребление символа влияет на связанную выходную последовательность. Нет требований к программному классу.
Обычно overflow возвращается, c чтобы указать на успех, за исключением тех случаев, когда traits::eq_int_type(c, traits::eof()) возвращается true, и в этом случае он возвращается traits::not_eof(c).