30 Input/output library [input.output]

30.9 File-based streams [file.streams]

30.9.2 Class template basic_­filebuf [filebuf]

30.9.2.4 Overridden virtual functions [filebuf.virtuals]

streamsize showmanyc() override;

Effects: Ведет себя так же, как basic_­streambuf​::​showmanyc() ([streambuf.virtuals]).

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

int_type underflow() override;

Effects: Ведет себя в соответствии с описанием basic_­streambuf<charT, traits>​::​underflow()со специализацией, согласно которой последовательность символов считывается из входной последовательности, как если бы она считывала из связанного файла во внутренний буфер (extern_­buf), а затем как если бы выполнялась:

char   extern_buf[XSIZE];
char*  extern_end;
charT  intern_buf[ISIZE];
charT* intern_end;
codecvt_base::result r =
  a_codecvt.in(state, extern_buf, extern_buf+XSIZE, extern_end,
               intern_buf, intern_buf+ISIZE, intern_end);

Это должно быть сделано таким образом, чтобы класс мог восстановить позицию (fpos_­t), соответствующую каждому символу между intern_­buf и intern_­end. Если значение r указывает, что в нем не a_­codecvt.in() хватает места intern_­buf, повторите попытку с большим intern_­buf.

int_type uflow() override;

Effects: Ведет себя в соответствии с описаниемbasic_­streambuf<charT, traits>​::​uflow(), со специализацией, заключающейся в том , что последовательность символов считывается из ввода тем же методом, что и underflow.

int_type pbackfail(int_type c = traits::eof()) override;

Effects: Возвращает символ, обозначенный значком,c во входную последовательность, если это возможно, одним из трех способов:

  • Если traits​::​eq_­int_­type(c, traits​::​eof()) возвращается false и , если функция делает позицию Putback доступную и если traits​::​eq(to_­char_­type(c), gptr()[-1]) возвращается true, вычитает следующий указатель для входной последовательности, gptr().

    Возвращает: c.

  • Если traits​::​eq_­int_­type(c, traits​::​eof()) возвращается, false и если функция делает доступной позицию возврата и если функции разрешено назначать позицию возврата, уменьшает следующий указатель для входной последовательности и сохраняетc его.

    Возвращает: c.

  • Если traits​::​eq_­int_­type(c, traits​::​eof()) возвращается true, и если либо входная последовательность имеет место Putback доступны или функция делает положение Putback доступна, вычитает следующий указатель для входной последовательности, gptr().

    Возвращает: traits​::​not_­eof(c).

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

Remarks: Если is_­open() == false, функция всегда терпит неудачу.

Функция не возвращает символ непосредственно во входную последовательность.

Если функция может быть успешной более чем одним из этих способов, не указано, какой путь будет выбран. Функция может изменить количество позиций возврата, доступных в результате любого вызова.

int_type overflow(int_type c = traits::eof()) override;

Effects: Ведет себя в соответствии с описанием basic_­streambuf<charT, traits>​::​overflow(c), за исключением того, что поведение «потребляющих символов» выполняется путем предварительного преобразования, как если бы:

charT* b = pbase();
charT* p = pptr();
charT* end;
char   xbuf[XSIZE];
char*  xbuf_end;
codecvt_base::result r =
  a_codecvt.out(state, b, p, end, xbuf, xbuf+XSIZE, xbuf_end);

а потом

  • Еслиr == codecvt_­base​::​error тогда не получится.

  • Еслиr == codecvt_­base​::​noconv тогда вывести символы от b до (и не включая)p.

  • Еслиr == codecvt_­base​::​partial затем вывести в файл символы от xbuf доxbuf_­endи повторить, используя символы от end доp. Если вывести не удалось, завершитесь ошибкой (без повторения).

  • В противном случае вывести изxbuf вxbuf_­endи потерпеть неудачу, если вывести не удалось . На этом этапе, еслиb != p иb == end (xbuf недостаточно большое), увеличьтеXSIZE и повторите сначала.

Returns: traits​::​not_­eof(c) для обозначения успеха и traits​::​eof() для обозначения неудачи. Если is_­open() == false, функция всегда терпит неудачу.

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

Effects: Если setbuf(0, 0) вызывается в потоке до того, как в этом потоке произошел какой-либо ввод-вывод, поток становится небуферизованным. В противном случае результаты определяются реализацией. «Unbuffered» означает , что pbase() и pptr() всегда возвращают нуль и вывод в файл должен появиться как можно скорее.

pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;

Effects: Пусть width обозначают a_­codecvt.encoding(). Если is_­open() == false, или off != 0 && width <= 0, то операция позиционирования не выполняется. В противном случае, если way != basic_­ios​::​cur или off != 0, и если была выведена последняя операция, обновите выходную последовательность и запишите любую несмещенную последовательность. Далее ищем новую позицию: если width > 0звоните fseek(file, width * off, whence), в противном случае звоните fseek(file, 0, whence).

Remarks: «Последняя операция была выведена» означает, что либо последняя виртуальная операция была переполнена, либо буфер размещения не пуст. «Записать любую последовательность без сдвига» означает, что width если меньше нуля, то вызвать a_­codecvt.unshift(state, xbuf, xbuf+XSIZE, xbuf_­end) и вывести результирующую последовательность без сдвига. Функция определяет одно из трех значений аргументаwhenceтипа int, как указано в таблице118.

Таблица118 -seekoff эффекты
way Ценитьstdio Эквивалент
basic_­ios​::​beg SEEK_­SET
basic_­ios​::​cur SEEK_­CUR
basic_­ios​::​end SEEK_­END

Returns: Недавно созданный pos_­type объект, который, если возможно, сохраняет позицию результирующего потока. Если операция позиционирования завершается неудачно или объект не может представлять позицию результирующего потока, возвращается pos_­type(off_­type(-1)).

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

Если возможно, изменяет положение файла, чтобы оно соответствовало положению, сохраненному вsp (как описано ниже). Изменение положения файла происходит следующим образом:

  1. 1.если (om & ios_­base​::​out) != 0, то обновить выходную последовательность и записать любую несмещенную последовательность;

  2. 2.установить позицию файла,sp как если бы при вызовеfsetpos;

  3. 3.если (om & ios_­base​::​in) != 0, то обновить входную последовательность;

гдеom открытый режим передан последнему вызову open(). Приis_­open() возврате операция завершается ошибкой false.

Еслиsp это недопустимая позиция потока или функция не позиционирует ни одну последовательность, операция позиционирования завершается ошибкой. Еслиsp не был получен предыдущим успешным вызовом одной из функций позиционирования (seekoff или seekpos) в том же файле, эффекты не определены.

Returns: sp об успехе. В противном случае возвращается pos_­type(off_­type(-1)).

int sync() override;

Effects: Если область размещения существует, вызывает filebuf​::​overflow запись символов в файл, а затем сбрасывает файл, как если бы путем вызоваfflush(file). Если область получения существует, эффект определяется реализацией.

void imbue(const locale& loc) override;

Requires: Если файл не расположен в начале и кодировка текущей локали, определяемая с помощью, зависит от a_­codecvt.encoding() состояния ([locale.codecvt.virtuals]), то этот фасет совпадает с соответствующим фасетомloc.

Effects: Заставляет символы, вставленные или извлеченные после этого вызова, преобразовыватьсяloc до следующего вызова imbue.

Remarks: Это может потребовать повторного преобразования ранее преобразованных символов. Это, в свою очередь, может потребовать от реализации возможности восстановить исходное содержимое файла.