Скачиваний:
46
Добавлен:
15.09.2014
Размер:
877.06 Кб
Скачать

650 Глава 11

11.6.4. Манипуляторы, определяемые пользователем

Пользователи могут создавать собственные манипуляторы потоков. Рис. 11.19 показывает создание и использование новых манипуляторов по­токов bell, ret (возврат каретки), tab и endLine. Пользователи могут также создавать собственные параметризованные манипуляторы потоков; обратитесь за справкой, как это сделать, к вашему руководству по системе.

11.7. Состояния формата потоков

Различные флаги формата задают виды форматирования, которые вы­полняются во время операций ввода-вывода. Управляют установками флагов функции-элементы setf, unsetf и fIags.

11.7.1. Флаги состояний формата

Каждый из флагов состояний формата, показанных на рис. 11.20, (а также тех флагов, которые не показаны) определяется как перечислимый тип в классе ios и разъясняется в нескольких следующих разделах.

Эти флаги могут управляться функциями-элементами flags, setf и unsetf, но многие программисты предпочитают использовать манипуляторы потоков (см. раздел 11.7.8). Программист может использовать операцию побитовое ИЛИ | для объединения разных опций в одно значение типа long (см. рис. 11.23). Вызов функции-элемента flags для потока с заданием этих соединен­ных операцией | опций устанавливает опции этого потока и возвращает зна­чение типа long, содержащее предыдущие значения опций. Это значение часто сохраняется с тем, чтобы можно было впоследствии вызвать функцию flags с этим сохраненным значением и восстановить предыдущие значения опций.

Функция flags должна задавать значение, выполняющее установку всех флагов. С другой стороны, единственный аргумент функции setf задает один или более флагов, соединенных операцией |, и может использовать текущие установки флагов для создания нового состояния формата.

Параметризованный манипулятор потока setiosflags выполняет те же функции, что и функция-элемент setf. Манипулятор потока resetiosflags вы­полняет те же функции, что и функция-элемент unsetf. Чтобы использовать любой из этих манипуляторов потока, убедитесь, что включена директива #include <iomanip.h>.

Флаг skipws показывает, что операция взять из потока » должна про­пускать символы разделители во входном потоке. По умолчанию операция » пропускается символы разделители. Чтобы изменить это, т.е. сбросить флаг skipws, используйте вызов функции unsetf (ios::skipws). Манипулятор потока ws также может быть использован для указания, надо ли пропускать символы разделители.

Потоки ввода-вывода в С++ _ 651

// figll_19.cpp

// Создание и проверка непараметризованных манипуляторов

// потока, определенных пользователем.

#include <iostream.h>

//Манипулятор bell (использующий управляющую // последовательность \a) ostream& bell (ostream& output)

{

return output « ' \a' ;

}

//Манипулятор ret (использующий управляющую последовательность \r)

ostream& ret(ostream& output)

{

return output « ' \r' ; }

//Манипулятор tab (использующий управляющую последовательность \t)

ostream& tab(ostream& output) {

return output « '\t'; }

//Манипулятор endLine (использующий управляющую

// последовательность \n)

//и функция-элемент flush

ostream& endLine(ostream& output)

{

return output « '\n' « flush;

main (

cout « "Проверка манипулятора tab:" « endLine

« 'a' « tab « 'b' « tab « 'c' « endLine « "Проверка манипуляторов ret и bell:" « endLine « " .......... " ;

for (int i = 1; i <= 100; i++) cout « bell;

cout « ret « " ----- " « endLine; return 0;

Проверка манипулятора tab:

а Ь с

Проверка манипуляторов ret и bell :

Рис. 11.19. Создание и проверка непараметризованных манипуляторов потока, определенных

пользователем

652