Стандартные потоки ввода-вывода
В файле iostream.h определены следующие объекты, связанные со стандартными потоками ввода-вывода. cin – объект класса istream, связанный со стандартным буферизированным входным потоком. cout – объект класса ostream, связанный со стандартным буферизированным выходным потоком. cerr – объект класса ostream, связанный со стандартным небуферизированным выходным потоком для сообщения об ошибках. clog – объект класса ostream, связанный со стандартным буферизированным выходным потоком для сообщения об ошибках. Для класса istream перегружена операция >>, а для класса ostream <<. Операции << и >> имеют два операнда. Левым операндом является объект класса istream (ostream), а правым – данное, тип которого задан в языке. Для того чтобы использовать операции << и >> для всех стандартных типов данных, используется соответствующее число перегруженных функций operator<< и operator>>. При выполнении операций ввода-вывода в зависимости от типа правого операнда вызывается та или иная перегруженная функция operator. Поддерживаются следующие типы данных: целые, вещественные, строки (char*), для вывода – void* (все указатели, отличные от char*, автоматически переводятся к void*). Функции operator<< и operator>>возвращают ссылку на тот потоковый объект, который указан слева от знака операции. Таким образом, можно формировать «цепочки» операций. cout << a << b << c; cin >> i >> j >> k; При записи цепочек операторов вывода нужно не забывать о приоритете операций. Зависимость от компилятора результатов выполнения цепочки операций вывода и необходимость аккуратно учитывать приоритеты операций приводят к следующей рекомендации: изменяемая переменная не должна появляться в цепочке вывода более одного раза.
Извлечение данных из потока начинается только после нажатия клавиши «Enter». При этом при извлечении числовых данных (без буфера) игнорируются начальные пробельные символы. Чтение начинается с первого непробельного символа и заканчивается при появлении нечислового символа. Значения указателей (т.е. адреса) выводятся в стандартный поток в шестнадцатеричном виде. Ввод-вывод массивов и символьных массивов-строк – это различные процедуры. char st[] = ”строка”; char* pst = st; cout << st; cout << pst; В обоих случаях будет выведено – строка. Операция <<, настроенная на операнд char*, всегда выводит строку, а не значение указателя. Чтобы вывести указатель, необходимо явное приведение типа. При вводе строки с клавиатуры набираются любые символы до тех пор, пока не будет нажата клавиша Enter. Система ввода-вывода переносит эту последовательность в буфер входного потока, а из буфера при выполнении каждой операции >> извлечение происходит до ближайшего пробела.
Форматирование Непосредственное применение операций ввода << и вывода >> к стандартным потокам cout, cin, cerr, clog для данных базовых типов приводит к использованию «умалчиваемых» форматов внешнего представления пересылаемых значений. Форматы представления выводимой информации и правила восприятия данных при вводе могут быть изменены программистом с помощью флагов форматирования. Эти флаги унаследованы всеми потоками из базового класса ios. Флаги форматирования определены в public перечислении класса ios следующим образом: enum { skipws = 0X0001; left = 0X0002; right = 0X0004; // и т.д. stdio = 0X4000; }; Таким образом, флаги форматирования реализованы в виде отдельных фиксированных битов и хранятся в protected компоненте класса long x_flags. Открытая функция long flags() возвращает значение переменной x_flags. Функция long flags(long f) устанавливает х_flags в новое значение f и возвращает предыдущее значение х_flags.
Функция long setf(long s, long f) устанавливает те биты в x_flags, которые в s и f имеют значение 1. Все биты, которые в s имеют значение 0, а в f – 1, сбрасываются. Возвращает предыдущее значение x_flags, логически умноженное на f. Функция long setf(long s) устанавливает те биты в x_flags, которые в s равны 1. Те биты, которые в s равны 0, остаются без изменения. Возвращает предыдущее значение x_flags, логически умноженное на s. Функция long unsetf(long s) сбрасывает те биты, которые в s равны 1. Биты, которые в s равны 0, остаются без изменений. Возвращает предыдущее значение x_flags, логически умноженное на s. Кроме флагов форматирования используются следующие protected компонентные данные класса ios: int x_width; – минимальная ширина поля вывода. int x_precision; – точность представления вещественных чисел (количество цифр дробной части) при выводе. int x_fill; – символ заполнитель при выводе, по умолчанию – пробел. Для получения (установки) значений этих полей используются следующие public компонентные функции: int width(); int width(int); int precision(); int precision(int); char fill(); char fill(char);
Манипуляторы Несмотря на гибкость и большие возможности управления форматами с помощью компонентных функций класса ios, их применение достаточно громоздко. Более простой способ изменения параметров и флагов форматирования обеспечивают манипуляторы. Манипуляторами называются специальные функции, позволяющие модифицировать работу потока. Особенность манипуляторов состоит в том, что их можно использовать в качестве правого операнда операции >> или <<. В качестве левого операнда, как обычно, используется поток (ссылка на поток), и именно на этот поток воздействует манипулятор. Для обеспечения работы с манипуляторами в классах istream и ostream имеются следующие перегруженные функции operator. istream& operator>>(istream&(*_f)(istream&)); ostream& operator<<(ostream&(*_f)(ostream&)); При использовании манипуляторов следует включить заголовочный файл <iomanip.h>. Приведем список встроенных манипуляторов: dec – устанавливает десятичную систему счисления; hex – шестнадцатеричную; oct – восьмеричную; endl – вставляет в поток вывода символ новой строки и затем сбрасывает поток; ends – вставляет ‘\Æ’ в поток вывода;
flush – сбрасывает поток вывода; ws – выбирает из потока ввода пробельные символы, поток будет читаться до появления символа, отличного от пробельного; setbase(int) – устанавливает основание системы счисления; resetiosflags(long f) – сбрасывает флаги форматирования, для которых в f установлен бит в 1; setiosflags(long f) – устанавливает те флаги форматирования, для которых в f соответствующие биты установлены в 1; setfill(int c) – устанавливает символ-заполнитель (с – код символа-заполнителя); setprecision(int n) – устанавливает точность при выводе вещественных чисел; setw(int n) – устанавливает минимальную ширину поля вывода.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|