- •( Stream – поток, I - input , o – output)
- •Иерархия потоковых классов (одна ветвь)
- •Стандартные потоки ввода – вывода
- •1) Для целых чисел, 2) для вещественных чисел и 3) для строк
- •Компонентные функции класса ios для форматирования
- •Манипуляторы с параметрами ( определены в файле iomanip.H )
- •Ввод-вывод для типов, определенных пользователем
- •Функции чтения
- •Работа с файлами
- •Ввод-вывод нижнего уровня
- •Текстовой и бинарный файлы
- •Открытие и закрытие файлов
- •Чтение и запись данных
- •Int fd ; // дескриптор файла
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; - ввод строки.
Форматирование данных при обмене с потоками
При применении операций ввода – вывода к стандартным потокам по умолчанию устанавливаются стандартные форматы внешнего представления пересылаемых данных.
Например, при выводе данные занимают ровно столько позиций, сколько надо для их представления.
Форматы представления могут быть изменены программистом с помощью:
-
флагов форматирования класса ios
-
компонентных функций для управления форматами класса ios
-
с помощью манипуляторов потоков без параметров и с параметрами
Флаги
Флаги – представляют собой отдельные фиксированные биты чисел типа 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 ) или непосредственно значения флагов
Как установить и проверить значения флагов рассмотрим ниже.