30 Input/output library [input.output]

30.6 Stream buffers [stream.buffers]

30.6.2 Stream buffer requirements [streambuf.reqts]

Буферы потоков могут накладывать различные ограничения на последовательности, которыми они управляют. Некоторые ограничения:

  • Управляемая входная последовательность не читается.

  • Управляемая выходная последовательность не может быть записана.

  • Управляемые последовательности могут быть связаны с содержимым других представлений для последовательностей символов, таких как внешние файлы.

  • Управляемые последовательности могут поддерживать операции directly с ассоциированными последовательностями или из них.

  • Управляемые последовательности могут налагать ограничения на то, как программа может читать символы из последовательности, записывать символы в последовательность, возвращать символы во входную последовательность или изменять положение потока.

Каждая последовательность характеризуется тремя указателями, которые, если они не равны нулю, все указывают на один и тот же charT объект массива. Объект массива представляет в любой момент (под) последовательность символов из этой последовательности. Операции, выполняемые над последовательностью, изменяют значения, хранящиеся в этих указателях, выполняют чтение и запись непосредственно в или из связанных последовательностей, а также изменяют «позицию потока» и состояние преобразования по мере необходимости для поддержания этой взаимосвязи подпоследовательностей. Три указателя:

  • адрес beginning pointer, или наименьший адрес элемента в массиве (называемый xbeg здесь);

  • адрес next pointer, или следующий элемент, который является текущим кандидатом на чтение или запись ( xnext здесь называется );

  • end pointerили первый элемент адрес за концом массива ( так называемый xend здесь).

Следующие семантические ограничения всегда должны применяться к любому набору из трех указателей для последовательности, используя имена указателей, указанные непосредственно выше:

  • Если xnext не является нулевым указателем, то xbeg и xend также должны быть ненулевыми указателями на тот же charT массив, как описано выше; в противном случае xbeg и xend также должно быть недействительным.

  • Если xnext это не нулевой указатель и xnext < xend для выходной последовательности, то write position доступен. В этом случае *xnext должен быть назначен в качестве следующего элемента для записи (для помещения или сохранения символьного значения в последовательность).

  • Если xnext это не нулевой указатель и xbeg < xnext для входной последовательности, то putback position доступен. В этом случае xnext[-1] должен иметь определенное значение и быть следующим (предыдущим) элементом для хранения символа, который возвращается во входную последовательность.

  • Если xnext это не нулевой указатель и xnext < xend для входной последовательности, то read position доступен. В этом случае *xnext должен иметь определенное значение и быть следующим элементом для чтения (для получения или для получения символьного значения из последовательности).