Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Стандартные потоки ввода-вывода




В файле 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...