В C++ нет встроенных средств ввода-вывода. Альтернативой этому служит наличие библиотек ввода-вывода. Рассмотрим библиотеку iostream, имеющую средства управления экраном и клавиатурой.
Базовая библиотека ввода-вывода потоков iostream обладает улучшенной гибкостью и элегантностью по сравнению с другими библиотеками ввода-вывода,например, с stdio. Поэтому, настоятельно рекомендуем пользоваться этой библиотекой. Библиотека построена в виде иерархии классов.
Потоковый ввод может применятся с стандартным входным потоком cin(клавиатура). Для выполнения ввода используется перегруженная операция ">>" - операция извлечения.
cin>>per; //p - переменная базовых типов.
С клавиатуры читается последовательность символов до пробела, преобразуется к типу per и помещается в per.
Потоковый вывод применяется со стандартным выходным потоком cout(экран дисплея). Для выполнения вывода используется перегруженная операция "<<" - операция вставки.
cout<< per;//per-перем.,выражение,константа базовых типов.
Значение per преобразуется в последовательность символов и выводится на экран.
Несколько операторов вывода с операцией вставки (<<) можно объединять в один (сцеплять). Тоже относится и к операции извлечения, но при вводе необходим разделитель-пробел.
Форматирование ввода/вывода в библиотеке iostream.h выполняется флагами форматирования и некоторыми функциями, заданными в классе ios. Перечислим флаги форматирования:
---------------------------------------------------------------------------------
Поле Флаг Действия
---------------------------------------------------------------------------------
ios::adjustfield ios::left Прижим влево
ios::right Прижим вправо
ios::basefield ios::dec Вывод целого десятичного
ios::oct Вывод целого восьмеричного
ios::hex Вывод целого шестнадцатиричного
ios::floatfield ios::fixed Вывод с фиксированной точкой
ios::scientific Вывод с плавающей точкой
ios::skipws Пропуск пробелов при вводе
ios::showbase Вывод целых чисел с основанием
системы счисления
ios::showpoint Вывод вещественных с десятич-
ной точкой и хвостовыми нулями
ios::showpos Вывод положительных чисел с +
ios::uppercase Вывод прописных X и E
Перечислим функции форматирования класса ios.
- Установка флагов форматирования:
seft(flag) - для флагов без поля форматирования;
seft(flag,pole) - для флагов с полем форматирования.
Примеры:
cout.setf(ios::showpos);
cout.setf(ios::fixed,ios::floatfield);
cout.setf(ios::showpoint|ios::uppercase);//Несколько флагов
- Сброс флагов форматирования: unsetf(flag);
- Установка ширины поля вывода:
width(n) - устанавливает ширину поля n позиций и возвращает предыдущую ширину;
width() - только возвращает текущую ширину поля.
Пример:
cout.width(5);
cout<<123; //__123
cout<<456; //456 ширина поля сбросилась в ноль
- Установка символа-заполнителя:
fill(ch) - устанавливает символ-заполнитель ch и возвращает предыдущий;
fill() - только возвращает текущий символ-заполнитель. По умолчанию - пробел.
Пример:
cout.fill('*');
cout.width(5);
cout<<123; //**123
- Установка точности вещественных чисел:
precision(n) - устанавливает n цифр после точки и возвращает предыдущее значение;
precision() - только возвращает точность. По умолчанию точность равна 6 и хвостовые нули усекаются. Если после точки имеются только нули, то усекаются хвостовые нули и точка.
Пример:
cout.precision(2);
cout<<1.2345; //1.23
Альтернативным способом форматирования ввода/вывода является использование функций-манипуляторов:
dec - ввод/вывод целых десятичных чисел;
oct - ввод/вывод целых восьмеричных чисел;
hex - ввод/вывод целых шестнадцатиричных чисел;
setw(n) - установка ширины поля n;
setprecision(n) - установка точности n;
setfill(ch) - установка символа-заполнителя ch;
ws - извлечение пробелов при вводе;
endl - вставка символа новой строки и очистки потока(вывод);
ends - вставка конечного нулевого символа в строку(вывод);
setbase(n)-установка системы счисления при преобразованиях;
setiosflags(flag) - установка флагов форматирования flag;
resetiosflags(flag) - очистка флагов форматирования flag.
Манипуляторы могут быть записаны прямо в операциях ввода/вывода в виде цепочки. При использовании параметризированных манипуляторов необходимо включить в программу библиотеку iomanip.h.
Пример:
cout<<setw(7)<<setprecision(2)<<12.345 //__12.34
Основными средствами ввода/вывода библиотеки iostream.h являются операции вставки (<<) и извлечения (>>). Помимо операций вставки и извлечения для ввода/вывода можно использовать функции.
- Ввод с клавиатуры символа: get(ch) - функция с параметром; get() - функция без параметра.
cin.get(ch);
ch=cin.get();
- Ввод с клавиатуры строки: get(),getline(),read().
cin.get(buf,n[,razd]);
cin.getline(buf,n[,razd]);
cin.read(buf,n);
,где buf - массив символов, n -количество символов, razd -символ-разделитель.
Функция get прекращает ввод, когда либо введено n-1 символов, либо встретился символ-разделитель razd, который не вводится, либо - символ конца файла(^Z). Отличие функции getline от get в том, что символ-разделитель razd тоже вводится.
- Вывод символа на экран: put(ch).
cout.put(ch);
- вывод строки на экран: write().
cout.write(buf.n);
Отличие этих функций от операций вставки и извлечения в том, что они не имеют средств форматирования и преобразования данных.
Для ввода с клавиатуры содержимого документов и вывода результатов задач на экран предпочтение лучше отдать операциям >> и <<. При вводе строки, имеющей внутри пробелы, операция извлечения (>>) введет только часть строки до первого пробела. В такой ситуации лучше использовать функции.