- •3.8. Упражнения 49
- •Введение
- •1. Базовые элементы
- •1.1. Комментарии
- •1.2. Функция «main»
- •1.3. Идентификаторы и пространства имен
- •1.4. Типы
- •1.5. Переменные
- •1.7. Константы
- •1.6. Преобразование типов
- •1.8. Потоковый ввод – вывод
- •1.9. Операции
- •1.9.1. Арифметические операции
- •1.9.2. Поразрядные операции
- •1.9.3. Условный оператор
- •1.9.4. Операции отношения
- •1.9.5. Логические операции
- •1.10. Стандартные математические функции
- •1.11. Упражнения
- •2. Базовые конструкции
- •2.1 Ветвление
- •2.1.1. Конструкция «if – else»
- •2.1.2. Конструкция «switch»
- •2.2. Циклы
- •2.2.1. Цикл «for»
- •2.2.2. Цикл «while»
- •2.2.3. Цикл «do – while»
- •2.2.4. Операторы циклов
- •2.2.5. Вложенность
- •2.3. Упражнения
- •2.3.1. Ветвления
- •2.3.2. Циклы
- •2.3.3. Вложенность
- •3. Указатели. Массивы. Структуры
- •3.1. Указатели
- •3.2. Массивы
- •3.2.1. Статические массивы
- •3.2.2. Динамические массивы
- •3.4. Ссылки
- •3.5. Структуры
- •3.6. Объединение
- •3.7. Переопределение типов
- •3.8. Упражнения
- •3.8.1. Статические и динамические массивы
- •3.8.2. Многомерные массивы
- •3.8.3. Строки
- •4. Функции
- •4.1. Простые функции
- •4.2. Рекурсия
- •4.3. Указатели и ссылки
- •4.3.1. Передаваемые параметры
- •4.3.2. Возвращаемые значения
- •4.3.3. Ссылки и структуры в функциях
- •4.3.4. Указатели и массивы в функциях
- •4.3.5. Указатели и ссылки на функцию
- •4.4. Шаблоны функций
- •4.5. Упражнения
- •4.5.1. Простые функции
- •4.5.2. Параметры – ссылки и параметры — указатели
- •5. Стандартные классы
- •5.1. Класс «pair»
- •5.2. Класс «complex»
- •5.3. Класс «string»
- •5.4. Контейнеры. Алгоритмы. Итераторы
- •5.5. Класс «vector»
- •5.6. Упражнения
- •5.6.1. Класс «string»
- •5.6.2. Класс «vector»
- •6. Файловый ввод – вывод
- •6.1. Операции
- •6.2. Методы
- •6.3. Флаги
- •6.4. Двоичный режим
- •6.5. Упражнения
- •Ллитература
1.8. Потоковый ввод – вывод
В С++ операции ввода и вывода реализуются с помощью объектов «cin» и «cout», доступных при подключении стандартной библиотеки <iostream>. Они предназначены для работы со стандартными потоками. Потоком же называют некоторый абстрактный канал связи между источником данных и их приемником. Для объекта «cin» источником является консоль, а для объекта «cout», консоль является приемником, поэтому «cin» используется для ввода данных, а «cout» – для их вывода.
Для того, чтобы вывести на экран какие-либо данные, необходимо воспользоваться оператором вывода «<<», а для ввода данных используется оператор ввода «>>». Наравне со стандартными потоками вывода возможно и использование унаследованных из языка С функций «printf()» или «scanf()», однако их использование представляется более утомительным, т.к. эти функции требуют явного указания типов данных. Более того, операторы ввода и вывода могут быть перегружены, что делает работу со своими классами аналогичной работе со стандартными.
Потоковые операции ввода и вывода являются каскадируемыми, т.е. нет необходимости при каждой операции ссылаться на объект потока. Это связано с тем, что возвращаемым результатом данных операторов является сам поток, который и может быть снова использован.
Листинг 1.4. Каскадирование.
#include <iostream>
using namespace std;
int main (void)
{
char c;
int i;
cout << "enter char x and int y" << endl;
cin >> c >> i;
cout << "c = " << c << endl << "i = " << i << endl;
return 0;
}
Важным свойством потоков является их способность различать манипуляторы, оказывающие действие на данные, следующие за ними.
Наиболее часто употребляется манипулятор «endl», функциональность которого для консоли аналогична выводу символа «\n» – переводу строки. В стандартной библиотеке, в файле <iomanip> определены различные манипуляторы, позволяющие форматировать поток.
Листинг 1.5. Использование манипуляторов.
#include <iostream>
#include <iomanip>
using namespace std;
int main (void)
{
const bool x = true;
cout << boolalpha << x << " or " << noboolalpha << x << endl;
const unsigned int y = 15;
cout << "hex: " << hex << y << endl;
cout << "oct: " << oct << y << endl;
cout << "dec: " << dec << y << endl;
double z = 1234567889e-9;
cout << z << endl;
cout << left << setw(10) << setfill('0') << z << endl;
cout << right << setw(10) << setfill('0') << z << endl;
cout << setprecision(9) << z << endl;
cout << noshowpoint << 1.0 << endl;
cout << showpoint << 1.0 << endl;
return 0;
}
Таблица 1.4. Некоторые стандартные манипуляторы.
Манипулятор |
Описание |
boolalpha / noboolalpha |
Логические переменные в виде «true», «false» или «1», «0» |
hex / dec / oct |
Числа в шестнадцатеричном, десятичном, восьмеричном виде |
setprecision() |
Задание числа выводимых дробных разрядов |
setw() |
Задание ширины поля вывода чисел |
setfill() |
Задание символа – заполнителя свободного пространства |
internal |
Заполнение между знаком или основанием и самим числом |
left / right |
Задание положения поля данных |
showpoint / noshowpoint |
Дробные чисела без дробной части с точкой или без нее |
showpos |
Выводить знак «+» перед положительными числами |
skipws / noskipws |
Пропуск пробельных символов или их считывание, как лексем |
ws |
Пропуск пробельной последовательности |
uppercase |
Вывод в верхнем регистре шестнадцатеричных символов, «E» и «X» |
scientific / fixed |
Экспоненциальный вывод числа или вывод с фиксированной точкой |
Наряду с манипуляторами применяются различные методы по работе с потоками ввода – вывода. Метод «ignore()» удаляет из потока ввода часть символов. Метод «clear()» сбрасывает флаги состояния потока, например, флаг «goodbit» – отсутствия ошибок. Доступ к флагам осуществляется соответствующими методами; для «goodbit» – это метод «good()».
Листинг 1.6. Методы.
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
int main (void)
{
int iter;
cin >> iter; //ввод целого числа;
cout << cin.good() << endl; //при неверном вводе;
cin.clear(ios::goodbit); //сброс флага good;
cin.ignore(1, '\n'); //удаление из потока введеного числа;
cin >> iter; //очередной ввод;
cout << endl;
return 0;
}
