30 Input/output library [input.output]

30.6 Stream buffers [stream.buffers]

30.6.3 Class template basic_­streambuf [streambuf]

30.6.3.4 basic_­streambuf virtual functions [streambuf.virtuals]

30.6.3.4.1 Locales [streambuf.virt.locales]

void imbue(const locale&);

Effects: Измените любые переводы в зависимости от языкового стандарта.

Remarks: Позволяет производному классу получать информацию об изменениях в локали в момент их возникновения. Между вызовами этой функции класс, производный от streambuf, может безопасно кэшировать результаты вызовов функций локали и членов полученных таким образом фасетов.

Default behavior: Ничего не делает.

30.6.3.4.2 Buffer management and positioning [streambuf.virt.buffer]

basic_streambuf* setbuf(char_type* s, streamsize n);

Effects: Влияет на буферизацию потока способом, который определяется отдельно для каждого класса, производного от basic_­streambuf этого пункта ([stringbuf.virtuals], [filebuf.virtuals]).

Default behavior: Ничего не делает. Возврат this.

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]).

Default behavior: Возврат pos_­type(off_­type(-1)).

pos_type seekpos(pos_type sp, ios_base::openmode which = ios_base::in | ios_base::out);

Effects: Изменяет позиции потока в одной или нескольких управляемых последовательностях способом, который определяется отдельно для каждого класса, производного от basic_­streambuf этого пункта ([stringbuf], [filebuf]).

Default behavior: Возврат pos_­type(off_­type(-1)).

int sync();

Effects: Синхронизирует контролируемые последовательности с массивами. То есть, если не pbase() равно нулю, символы между pbase() и pptr() записываются в управляемую последовательность. Затем указатели могут быть при необходимости сброшены.

Returns: -1 при неудаче. Что составляет отказ, определяется каждым производным классом ([filebuf.virtuals]).

Default behavior: Возвращает ноль.

30.6.3.4.3 Get area [streambuf.virt.get]

streamsize showmanyc();300

Returns: Оценка количества символов, доступных в последовательности, или -1. Если он возвращает положительное значение, то последовательные вызовы underflow() не будут возвращаться traits​::​eof() до тех пор, пока из потока не будет извлечено хотя бы это количество символов. Если showmanyc() возвращается -1, вызовы underflow() или uflow() завершатся ошибкой.301

Default behavior: Возвращает ноль.

Remarks: Использует traits​::​eof().

streamsize xsgetn(char_type* s, streamsize n);

Effects: Присваивает доn символов последовательным элементам массива, первый элемент которого обозначенs. Назначенные символы считываются из входной последовательности, как если бы при повторных вызовах sbumpc(). Назначение прекращается, когда либоn были назначены символы, либоsbumpc() возвращался вызов traits​::​eof().

Returns: Количество присвоенных символов.302

Remarks: Использует traits​::​eof().

int_type underflow();

Remarks: Открытые члены basic_­streambuf вызывают эту виртуальную функцию только в том случае, если она gptr() равна нулю или gptr() >= egptr()

Returns: traits​::​to_­int_­type(c), гдеc является первым character из pending sequence, без перемещения позиции входной последовательности за ним. Если ожидающая последовательность пуста, функция возвращается, traits​::​eof() чтобы указать на сбой.

pending sequence Символов определяется как конкатенация

  • пустая последовательность, если онаgptr() равна нулю, в противном случае символы в [gptr(), egptr()), за которыми следует

  • некоторая (возможно, пустая) последовательность символов, прочитанная из входной последовательности.

Это 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 - длина резервной последовательности).

Default behavior: Возврат traits​::​eof().

int_type uflow();

Requires: Ограничения те же, что и для underflow(), за исключением того, что символ результата должен быть перенесен из ожидающей последовательности в резервную последовательность, а ожидающая последовательность не должна быть пустой перед передачей.

Default behavior: Звонки underflow(). Если underflow() возвращается traits​::​eof(), возвращается traits​::​eof(). В противном случае возвращает значение traits​::​to_­int_­type(*gptr()) и увеличивает значение следующего указателя для входной последовательности.

Returns: traits​::​eof() для обозначения отказа.

Морфемы словаshowmanyc «es-how-many-see», а не «show-manic».

underflow или uflow может потерпеть неудачу из-за преждевременного создания исключения. Намерение состоит не только в том, чтобы звонки не возвращались, eof() но и в том, чтобы они вернулись «немедленно».

Классы, производные от, basic_­streambuf могут предоставить более эффективные способы реализации xsgetn() и xsputn() переопределения этих определений из базового класса.

30.6.3.4.4 Putback [streambuf.virt.pback]

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() вызывается только тогда, когда возвращение действительно не удалось.

Возвращает какое-то значение, отличное от traits​::​eof() успешного.

Default behavior: Возврат traits​::​eof().

30.6.3.4.5 Put area [streambuf.virt.put]

streamsize xsputn(const char_type* s, streamsize n);

Effects: Записывает доn символов в выходную последовательность, как если бы при повторных вызовах sputc(c). Записанные символы получаются из последовательных элементов массива, первый элемент которого обозначен знакомs. Запись останавливается, когда либоn символы были написаны, либоsputc(c) возвращался вызов traits​::​eof(). Не указано, вызывает ли функция,overflow() когдаpptr() == epptr() становится,true или она достигает тех же результатов другими способами.

Returns: Количество написанных символов.

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. 1.Указывается влияние употребления символа на связанную выходную последовательность.303

  2. 2.Позвольте r быть количеством символов в ожидающей последовательности, которые не используются. Если неr равно нулю , то pbase() и pptr() должен быть установлен таким образом, чтобы: pptr() - pbase() == r аr символы , начинающиеся на pbase() это соответствующий выходной поток. В случае, если онr равен нулю (все символы ожидающей последовательности были израсходованы), то либо pbase() устанавливается nullptr, либо pbase() и pptr() оба установлены на одно и то же ненулевое значение.

  3. 3.Функция может завершиться ошибкой, если не удается добавить какой-либо символ в связанный выходной поток или если он не может быть установлен pbase() и в pptr() соответствии с вышеуказанными правилами.

Returns: traits​::​eof() или выдает исключение, если функция не работает.

В противном случае возвращает какое-либо значение, отличное от traits​::​eof() указания успеха.304

Default behavior: Возврат traits​::​eof().

То есть для каждого класса, производного от экземпляра basic_­streambuf в этом разделе ([stringbuf], [filebuf]), дается спецификация того, как потребление символа влияет на связанную выходную последовательность. Нет требований к программному классу.

Обычно overflow возвращается,c чтобы указать на успех, за исключением тех случаев, когда traits​::​eq_­int_­type(c, traits​::​eof()) возвращается true, и в этом случае он возвращается traits​::​not_­eof(c).