Программирование >>  Структурное программирование 

1 ... 215 216 217 [ 218 ] 219 220 221 ... 342


Программа на рис. 11.18 демонстрирует использование функции-элемента width при вводе и при выводе. Обратите внимание, что читается по крайней мере на один символ меньше, чем установленная ширина поля, чтобы обеспечить размеш;ение во входной строке нулевого символа. Помните, что операция взять из потока завершается, когда встречаются не лидируюш;ий символ разделитель (т.е. не предшествующий значащим символам).

Для установки ширины поля может быть также использован манипулятор потока setw.

figll 18.cpp

Демонстрация функции-элемента width

#include <iostream.h>

main { ) (

int w = 4;

char string[10];

cout << Введите предложение: endl; cin.width(5);

while (cin string) { cout.width(w++); cout << string << endl; cin.width(5);

return 0;

Введите предложение:

Это проверка функции-элемента widthZ Это пров ерка функ ции-элем ента widt h

Рис. 11.18. Демонстрация функции-элемента width

Типичная ошибка программирования 11.4

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



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

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

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

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

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

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

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

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

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

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



-liVr. Проверка манипулятора tab: a b с

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

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

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

I figll 19.cpp

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

tinclude <iostream.h>

1 Манипулятор bell (использующий управляющую последовательность \а) \ ostreamS bell(ostreamS output) {

1 return output \a ;

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

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

I ostreamS tab(ostreamS output) return output \t;

Манипулятор endLine (использующий управляющую I последовательность \n) I и функция-элемент flush ostreamS endLine(ostreamS output) (

return output \n flush;

*V 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;



1 ... 215 216 217 [ 218 ] 219 220 221 ... 342

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика