Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
42
Добавлен:
16.02.2016
Размер:
210.94 Кб
Скачать

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

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

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

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

#include <iostream.h>

//Манипулятор bell (использует escape-последовательность \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;

}

int 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;

}

РЕЗЮМЕ

Каждая операция ввода-вывода осуществляется способом, чувствительным к типу данных. В языке С++ производится ввод-вывод потоков байтов. Поток — это просто последовательность байтов. Механизм ввода-вывода заключается в пересылке байтов данных от устройств в оперативную память и обратно эффективным и надежным способом.

Язык С++ предоставляет возможности для ввода-выводакак на «низ­ком», так и на «высоком» уровнях. Ввод-вывод на низком уровне сво­дится к тому, что некоторое число байтов данных просто следует пере­слать от устройства в память или из памяти в устройство. Ввод-вывод на высоком уровне заключается в том, что байты группируются в такие значащие элементы данных, как, например, целые числа, числа с плавающей запятой, символы, строки, а также данные типов, определен­ных пользователем.

Язык С++ предоставляет возможности для неформатированного и фор­матированного ввода-вывода. Неформатированный ввод-вывод позволяет осуществлять пересылку файлов с высокой скоростью, но он обра­батывает только сырые данные, которыми сложно пользоваться. Форматированный ввод-вывод обрабатывает структурированные данные, но требует дополнительного времени на их обработку, что может быть недостатком при передаче больших объемов данных. Большинство программ на С++ включает заголовочный файл <iostream.h>, который содержит основную информация, необходимую для всех операций ввода-вывода.

Заголовочный файл <iomanip.h> содержит информацию, полезную для обработки форматированного ввода-вывода при помощи параметризо­ванных манипуляторов потока. Заголовочный файл <fstream.h> содержит информацию, необходимую для проведения операций с файлами. Заголовочный файл <strstream.h> содержит необходимую информацию для выполнения форматированного ввода-вывода в память. Заголовочный файл <stdiostream.h> включает важные сведения для программ, использующих для выполнения операций ввода-вывода со­ четание стилей языков С и С++.

  • Класс istream поддерживает операции ввода потоков.

  • Класс ostream поддерживает операции вывода потоков.

  • Класс iostream поддерживает как операции ввода, так и операции вы­ вода потоков.

  • Классы istream и ostream являются производными классами прямого наследования базового класса ios.

  • Класс iostream является производным классом множественного насле­ дования классов istream и ostream.

  • Операция сдвига влево («) перегружена для обозначения вывода в поток и называется операцией поместить в поток.

  • Операция сдвига вправо (») перегружена для обозначения ввода по­ тока и называется операцией взять из потока.

  • Объект стандартного потока ввода cin класса istream привязан к стан­ дартному устройству ввода, обычно к клавиатуре.

Объект стандартного потока вывода cout класса ostream привязан к стандартному устройству вывода, обычно к экрану дисплея.Объект cerr класса ostream привязан к стандартному устройству вывода сообщений o6 ошибках. Выводимые потоки данных для объекта cerr являются небуферизованными. Это означает, что каждая операция по­местить в cerr приводит к мгновенному появлению выводимых сооб­щений об ошибках.

Манипулятор потока endl вызывает переход на новую строку и кроме того приводит к сбросу буфера вывода.

Компилятор С++ автоматически определяет типы данных при вводе и выводе.

По умолчанию адреса отображаются в шестнадцатеричном формате. Для печати адреса следует привести тип указателя к типу void *.

Функция-элемент put выводит одиночный символ. Вызовы функции put могут быть сцепленными.

Ввод потока осуществляется операцией взять из потока ». Эта операция автоматически игнорирует символы разделители во входном потоке. Операция » возвращает false, если в потоке встретился признак конца файла. Операция взять из потока приводит к установке бита failbit при вводе данных неправильного типа и к установке бита badbit при неуспешном завершении операции. Можно последовательно вводить данные, используя операцию взять из потока в условном операторе заголовка цикла while. Операция взять из потока возвращает false, когда встречается признак конца файла.

Функция-элемент get без аргументов вводит одиночный символ из ука­занного потока и возвращает этот символ. Этот вариант функции get возвращает EOF, когда в потоке встречается признак конца файла. Функции-элемента get с символьным аргументом типа char вводит один символ. Функция возвращает EOF, когда встречается признак конца файла; в остальных случаях возвращается ссылка на тот объект класса istream, для которого вызывалась функция-элемент get.

Функции-элемента get с тремя аргументами: символьным массивом, максимальное число символов и ограничителем (по умолчанию значе­ние '\n')> читает символы из входного потока до тех пор, пока не достигается число символов, на 1 меньше указанного максимального числа, или пока не прочтется ограничитель. Введенная строка закан­чивается нулевым символом. Ограничитель в символьный массив непомещается, а остается во входном потоке.

Функция-элемент getline действует подобно варианту функции-элемен­та get с тремя аргументами. Функция getline удаляет символ ограни­читель из входного потока и не сохраняет его в строке. Функция-элемент ignore пропускает заданное число символов (по умол­чанию один символ) во входном потоке; она завершает свою работу при обнаружении заданного ограничителя (по умолчанию символом ограничителем является EOF).Функция-элемент putback возвращает обратно в этот поток предыдущий символ, полученный из входного потока с помощью функции get. Функция-элемент peek возвращает очередной символ из входного по­тока, но не удаляет его из потока.

Язык С++обеспечивает сохранение типов данных при вводе-выводе. Если операциями « и » обрабатываются непредусмотренные данные, то устанавливаются различные флаги ошибок, с помощью которых пользователь может определить, были ли операции ввода-вывода успешными, или нет.

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

Для изменения основания интерпретации целых чисел в потоке используйте манипулятор hex, чтобы установить шестнадцатеричный формат представления элементов данных (с основанием 16), или ма­нипулятор oct, чтобы установить восьмеричный формат представления данных (с основанием 8). Используйте манипулятор dec для возврата к основанию потока 10. Основание потока остается установленным до тех пор, пока оно не будет изменено явным образом новой установкой.Основание потока может быть также изменено с помощью манипуля­ тора потока setbase, который принимает один целый параметр со зна­чениями 10, 8 или 16, задающими соответствующие основания системы счисления.

Точностью печатаемых чисел с плавающей запятой можно управлять, используя манипулятор потока precision или функцию-элемент setprecision. Вызов любой из этих установок точности действует для всех последующих операций вывода до тех пор, пока не будет произведена следующая установка точности. Функция-элемент precision не имеет никаких аргументов и возвращает текущее значение точности. Точ­ность 0 устанавливает точность по умолчанию, равную 6. При использовании параметризованных манипуляторов потоков необ­ ходимо в программу включать заголовочный файл <iomanip.h>.

Функция-элемент width устанавливает ширину поля и возвращаетпредыдущую ширину поля. Если обрабатываемые значения имеют меньше символов, чем заданная ширина поля, то для заполнения лиш­них позиций используются заполняющие символы. Установка ширины поля влияет только на следующую операцию поместить или взять; затем ширина поля устанавливается неявным образом на 0, т.е. поля представления выходных значений будут просто такой ширины, которая необходима. Если число символов в обрабатываемом значении больше, чем заданная ширина поля, то число будет напечатано пол­ностью. Функция width, не имеющая аргументов, возвращает текущую установку. Для установки ширины поля может быть также использован манипулятор потока setw. При вводе манипулятор потока setw устанавливает максимальный раз­мерстроки;если вводится строка, превышающая заданный размер, то вводимая строка разбивается на фрагменты, не превышающие заданного размера.

Литература

  1. Глушаков С.В. , Коваль А.В., Черепнин С.А. Язык программирования С++, учебный курс: Харьков: «Фолио Аст», 2001-500 с.

  2. Харви Дейтел, Пол Дейтел, Как программировать на С++: Третье издание. Пер. с англ.-М.: ЗАО «Издательство БИНОМ», 2001 г. -1152 с.: ил.

  3. Баженова И.Ю. VisualC++6.0(VISUALSTUDIO98).Уроки программирования.-М.: Диалог-МИФИ, 2001-416 с.

Соседние файлы в папке ЛекцииКарасева