Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 57стр.doc
Скачиваний:
54
Добавлен:
15.06.2014
Размер:
478.21 Кб
Скачать

Вопрос 36. Манипуляторы потоков.

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

МП без аргументов:

Ws – пропуск пробелов при вводе

Dec, Oct,Hex - перевод в соотв СС

Endl – конец строки

Ends - вставка символа отсутствия инфы

Fflush – очистка

Lock – закрыть дескриптор файла unlock

МП c аргументами:

Setw(int) ширина поля

Setfill(char) устан символ заполнения

Setpresicion(int), precision - точность

Setiosflags(long) – устан флаг resetiosflags(long)

Манипуляторы потоков dec, oct, hex и setbase, задающие основание чисел

Целые числа обычно интерпретируются как десятичные (с основанием 10). Для изменения основания интерпретации целых чисел в потоке используют манипулятор hex, чтобы установить шестнадцатеричный формат представления элементов данных (с основанием 16), манипулятор oct - установить восьмеричный формат представления данных (с основанием 8). Dec - возврат к основанию потока 10.

Основание потока может быть также изменено с помощью манипулятора потока setbase, который принимает один целый параметр со значениями 10, 8 или 16, задающими соответствующие основания системы счисления.

Ширина поля (Setw(int), width)

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

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

Можно создавать собственные манипуляторы потоков: bell, ret (возврат каретки), tab и endLine.

Вопрос 37. Неформатированный ввод/вывод с помощью read/ write

Istream &read(unsigned char *buf, int num);

Ostream &write(const unsigned char *buf, int num);

Неформатированный ввод-вывод выполняется с помощью ф-ций-эл-тов read и write. Каждая из них вводит или выводит некоторое число байтов в символьный массив в памяти или из него. Эти байты не подвергаются какому-либо форматированию. Они просто вводятся или выводятся в качестве сырых байтов данных. Например, вызов

char buffer = "ПОЗДРАВЛЯЕМ С ДНЕМ РОЖДЕНИЯ"; cout.write(buffer, 12);

выводит первые 12 байтов символьного массива buffer (включая нулевые символы, которые могут быть выведены в cout и завершить операцию «). Поскольку символьная строка указывает на адрес своего первого символа, то вызов

cout.write("ABCDEFGYIJKLMNOPQRSTUVWXYZ", 10);

отобразит на экране первые 10 символов алфавита.

Ф-я read читает n байт из потока и посылает их в буфер

Приведение типов в этих ф-ях необходимо для работы с буфером, к-ый не определён как массив символов. Если конец файла достигнут до того, как read доработала, то она прекр работу, в буфере стока символов, скока прочитано.

Функция-элемент read вводит в символьный массив указанное число символов. Если считывается меньшее кол-тво символов, то устанавливается флаг failbit.

Ф-ция-эл-т gcount сообщает о кол-ве символов, прочитанных последней операцией ввода.

Программа вводит 20 символов (из более длинной входной последовательности) в массив символов buffer с помощью ф-ции-эл-та read, определяет число введенных символов с помощью gcount и выводит символьный массив buffer с помощью write.

Const int SIZE = 80;

main ( ) {

char buffer [SIZE];

cout « "Введите предложение:" « endl;

cin.read (buffer, 20);

cout « endl «"Введенное предложение: " « endl;

cout. write (buffer, cin . gcount ( ) ) ;

cout « endl;

return 0;}