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

1) Для целых чисел, 2) для вещественных чисел и 3) для строк

Все они по умолчанию игнорируют ведущие пробелы, и считывание идет до пробела или до первого недопустимого символа.

Чтение начинается с первого не пробельного символа и для чисел заканчивается при появлении нечислового символа

Для целых читаются также следующие символы +, -, и при 0x - A, a ,B, b, C, c D, d, E ,e, F ,f

Для вещественных чисел читаются символы + , - , E , e , и точка.

Для строк чтение происходит до первого пробельного символа.

Напр., название инструмента char line [40]

cin>>line

С клавиатуры набирается название отбойный молоток <enter>

В line считается только первое слово и вместо пробела заносится нулевой код ‘\0’.

Таким образом, объекты cin и cout с операциями >> и <<, знают, как выполнять ввод-вывод значений различных типов.

При организации выводимых выражений следует учитывать низкий приоритет сдвиговых операций, т.к. операции ввода-вывода имеют тот же приоритет:

cout<< a+ b+ c;

cout << (a + b < c); cout << ( 7<<1) ;

cout << ( x<0 ? –x : x);

Выражения с операциями >> и << должны возвращать значение (любая операция должна возвращать значение).

В соответствии с описанием перегрузок этих операций в файле iostream.h значением выражения

cout<< выражение

является ссылка на поток cout (фактически сам поток) и к результату операции включения как к объекту cout опять можно применить операцию включения <<. Аналогично и с операцией извлечения из потока cin >> ( или ввода данных).

Позволительно при одном обращении к потоку несколько раз применять операции ввода (исключения из потока) и вывода (включения в поток):

cout << … << … << « \n Cтроковое значение \t « <<…;

int i, j, k;

cin >> i >> j >> k ;

Значения для этих переменных во входном потоке должны разделяться обобщенными пробелами 1 2 3 < enter> либо 1 < enter>

2< enter>

3 < enter>

Можно ввести и больше данных, но почитается столько, сколько надо:

1 2 3 4 5 6 < enter>

Извлечение из потока cin происходит после сигнала от клавиши enter.

В процессе набора данных на клавиатуре они отражаются на экране, но не извлекаются из потока. Это дает возможность исправить ошибки ввода. После нажатия enter и происходит выполнение операции извлечения. Набранные данные помещаются в буфер, из буфера происходит их интерпретация и чтение.

При вводе вещественных значений допустимы все формы их записи и с фиксированной точкой и с плавающей точкой. Если затем мы выведем значение переменной. Оно будет выведено по возможности с фиксированной точкой и по умолчанию будет использовано 7 цифр. Исключение составляют очень большие и очень маленькие числа.

float a; cin >> a; cout <<”a=”<< a;

1.23456789 a=1.234568

0.123456789e+1 a=1.234568

123456789 a= 1.234567e+08

0.0000000000112345678 a=1.123457e-11

В операции ввода - вывода целых чисел данные можно представлять в восьмеричном и шестнадцатеричном виде. В каком бы виде данные не вводились, по умолчанию они всегда выводятся в десятеричном виде. Также, если в операторе вывода стоят восьмеричные или шестнадцатеричные константы, выведутся десятеричные величины:

cout << 077777 << « « << -0x7fff 32767 -32767

Ввод значений должен соответствовать диапазону значений данного типа. Например, если вводится слишком большое для данного типа значение данное не будет введено целиком, а будет обрезано в соответствии с внутренним представлением данного типа.

Значения указателей (адреса) выводятся в шестнадцатеричном формате, как было рассмотрено выше.

Вывод (ввод) данных числовых массивов производится поэлементно

float A[3];

for ( int i=o ; i<3; i++) { cin>> A [i]; cout << A[i] << « « ;}

cout<< A - выведется значение указателя - адрес

cin>> A // Ошибка на этапе компиляции!

Имя массива – константный указатель. Вводить с клавиатуры значение константного указателя нельзя. Но ввести значение символьного массива – строку, используя указатель – имя массива можно.

Ввод – вывод символьных массивов:

char H [ ] = « Миру – мир»

cout << H; - выведется строка

char * ph =H;

cin>>ph ; вводится новое значение с клавиатуры

cout << ph - выведется строка

сout << (void*) ph - выведется значение указателя – адреса

строки

сhar name[20]; cin >> name; - ввод строки.

Форматирование данных при обмене с потоками

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

Например, при выводе данные занимают ровно столько позиций, сколько надо для их представления.

Форматы представления могут быть изменены программистом с помощью:

  1. флагов форматирования класса ios

  2. компонентных функций для управления форматами класса ios

  3. с помощью манипуляторов потоков без параметров и с параметрами

Флаги

Флаги – представляют собой отдельные фиксированные биты чисел типа long . Эти фиксированные биты входят в компонент класса ios типа long:

long x_flags; // переменная, представляющая флаги – форматы

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

//флаги наследуются всеми потоками

Эта переменная анализируется при обменах, ее значение влияет на преобразование информации.

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

Компонентные функции класса ios : flags( ) и setf( ) предназначены для проверки значений флагов, для их установки и для их сбрасывания в исходные умалчиваемые значения.

Флаги могут обрабатываться как по отдельности, так и группами, когда отдельные флаги связаны побитовой логической операцией – дизъюнкцией ( ‘ | ’).

Рассмотрим флаги:

skipws = 0x0001 - пропуск (игнорирование) при операции извлечении из

потока обобщенные пробельные символы (действует

по умолчанию)

left =0x0002 – вывод с левым выравниванием

right = 0x0004 – вывод с правым выравниванием

internal=0x0008 - принятый в качестве заполнителя символ помещается

между числом и знаком числа или признаком системы

счисления.

dec = 0x0010 - десятичная система счисления

oct = 0x0020 - восьмеричная система счисления

hex = 0x0040 - шестнадцатеричная система счисления

showbase =0x0080 - выводить признак системы счисления ( 0x и 0);

showpoint = 0x0100 – печатать обязательно десятичную точку и следующие

за ней нули, даже для числа имеющего нулевую

дробную часть;

uppercase = 0x0200 – при выводе чисел использовать буквы верхнего

регистра (0X , E, ABCDEF )

scientific = 0x0800 – представление чисел в формате с плавающей точкой

мантисса имеет одну ненулевую цифру перед точкой

fixed = 0x1000 - представление в формате с фиксированной точкой ,

причем количество цифр после запятой определяется

заданной по умолчанию точностью;

unitbuf = 0x2000 – очищает все потоки ( сбрасывает содержимое буферов)

после каждого вывода

и т. д .

Можно использовать имена флагов, естественно с указанием их принадлежности классу ios ( ios::left ) или непосредственно значения флагов

Как установить и проверить значения флагов рассмотрим ниже.