Ввод и вывод
Ввод и вывод позволяют программе взаимодействовать с пользователем: показывать сообщения, запрашивать данные и отображать результаты вычислений.
В C++ для работы с консолью чаще всего используются два объекта стандартной библиотеки:
std::cout— вывод информации;std::cin— ввод данных.
Для использования этих объектов необходимо подключить заголовок <iostream>.
#include <iostream>int main() { std::cout << "Привет, мир!" << '\n'; return 0;}Результат выполнения:
Привет, мир!Вывод информации с помощью std::cout
std::cout используется для отображения текста, чисел и значений переменных в консоли.
Оператор << передаёт данные в поток вывода.
#include <iostream>int main() { int age = 18; double height = 175.5; std::cout << "Возраст: " << age << '\n'; std::cout << "Рост: " << height << '\n'; return 0;}Результат:
Возраст: 18Рост: 175.5Можно объединять несколько значений в одной инструкции. Для этого достаточно последовательно использовать оператор <<.
std::cout << "Сумма: " << 10 + 20 << '\n';Вывод:
Сумма: 30Вывод переменных и выражений
std::cout умеет выводить не только готовые значения, но и результаты выражений.
#include <iostream>int main() { int a = 15; int b = 7; std::cout << "Сложение: " << a + b << '\n'; std::cout << "Вычитание: " << a - b << '\n'; std::cout << "Умножение: " << a * b << '\n'; return 0;}Результат:
Сложение: 22Вычитание: 8Умножение: 105Выражение вычисляется, а полученное значение передаётся в поток вывода.
Перевод строки
Чтобы перейти на новую строку, можно использовать '\n' или манипулятор std::endl.
#include <iostream>int main() { std::cout << "Первая строка\n"; std::cout << "Вторая строка" << std::endl; return 0;}Оба варианта переводят вывод на следующую строку, но между ними есть отличие:
'\n'добавляет символ перевода строки;std::endlдобавляет перевод строки и принудительно сбрасывает буфер вывода.
В большинстве обычных случаев достаточно '\n'. std::endl полезен, когда требуется немедленно отправить накопленный вывод, например для диагностики.
Ввод данных с помощью std::cin
std::cin позволяет получать данные, которые пользователь вводит в консоль. Оператор >> извлекает значение из входного потока и записывает его в переменную.
#include <iostream>int main() { int age; std::cout << "Введите возраст: "; std::cin >> age; std::cout << "Ваш возраст: " << age << '\n'; return 0;}Пример работы:
Введите возраст: 21Ваш возраст: 21Последовательность действий:
- Объявляется переменная
age. - Программа просит пользователя ввести значение.
std::cin >> ageсчитывает целое число.- Полученное значение сохраняется в переменной.
- Программа выводит результат.
Ввод нескольких значений
Можно считывать несколько значений в одной инструкции, разделяя их пробелами или переводами строки.
#include <iostream>int main() { int a; int b; std::cout << "Введите два числа: "; std::cin >> a >> b; std::cout << "Сумма: " << a + b << '\n'; return 0;}Пример ввода:
12 8Результат:
Сумма: 20Ввод 12 8 и ввод этих же чисел на двух отдельных строках будут обработаны одинаково.
Ввод дробных чисел
std::cin может считывать значения разных типов, если введённые данные соответствуют ожидаемому формату.
#include <iostream>int main() { double price; std::cout << "Введите цену: "; std::cin >> price; std::cout << "Цена: " << price << '\n'; return 0;}Например, при вводе 19.99 переменная price получит соответствующее дробное значение.
Тип переменной должен соответствовать задаче. Если требуется хранить дробную часть, для этого обычно используют float или double, а не int.
Ввод текста: std::string
Для хранения текста в C++ используется std::string. Чтобы работать с этим типом, подключи заголовок <string>.
#include <iostream>#include <string>int main() { std::string name; std::cout << "Введите имя: "; std::cin >> name; std::cout << "Привет, " << name << "!\n"; return 0;}При вводе Alex программа выведет:
Введите имя: AlexПривет, Alex!Однако у std::cin >> name есть особенность: чтение прекращается при встрече пробельного символа. Поэтому ввод Alex Smith сохранит в name только Alex.
Чтение целой строки с помощью std::getline
Если требуется получить всю строку, включая пробелы, используй std::getline.
#include <iostream>#include <string>int main() { std::string fullName; std::cout << "Введите полное имя: "; std::getline(std::cin, fullName); std::cout << "Здравствуйте, " << fullName << "!\n"; return 0;}Пример:
Введите полное имя: Alex SmithЗдравствуйте, Alex Smith!std::getline считывает символы до перевода строки и сохраняет их в указанную строковую переменную.
Проблема смешивания std::cin и std::getline
Если сначала считать число через std::cin, а затем вызвать std::getline, можно неожиданно получить пустую строку.
int age;std::string name;std::cin >> age;std::getline(std::cin, name);Причина в том, что после ввода числа в потоке обычно остаётся символ перевода строки. Следующий std::getline встречает его сразу и завершает чтение.
Чтобы пропустить оставшиеся пробельные символы перед чтением строки, можно использовать std::ws.
#include <iostream>#include <string>int main() { int age; std::string fullName; std::cout << "Введите возраст: "; std::cin >> age; std::cout << "Введите полное имя: "; std::getline(std::cin >> std::ws, fullName); std::cout << "Возраст: " << age << '\n'; std::cout << "Имя: " << fullName << '\n'; return 0;}std::ws удаляет начальные пробельные символы, включая оставшийся перевод строки. Учитывай, что при таком подходе также будут пропущены пробелы в начале вводимой строки.
Форматирование вывода
Стандартная библиотека C++ предоставляет средства для настройки отображения чисел.
Количество знаков после запятой
Для управления точностью вывода используется std::setprecision из заголовка <iomanip>.
#include <iostream>#include <iomanip>int main() { double value = 3.1415926535; std::cout << std::setprecision(4) << value << '\n'; return 0;}По умолчанию std::setprecision задаёт количество значащих цифр, а не только цифр после десятичной точки.
Чтобы вывести ровно четыре цифры после точки, используй std::fixed вместе с std::setprecision.
#include <iostream>#include <iomanip>int main() { double price = 19.9; std::cout << std::fixed << std::setprecision(2); std::cout << price << '\n'; return 0;}Вывод:
19.90Вывод логических значений
По умолчанию значения bool выводятся как 1 и 0.
#include <iostream>int main() { bool isReady = true; std::cout << isReady << '\n'; return 0;}Чтобы выводить true и false, используй std::boolalpha.
#include <iostream>int main() { bool isReady = true; std::cout << std::boolalpha << isReady << '\n'; return 0;}Результат:
trueПроверка корректности ввода
Пользователь может ввести данные неправильного типа. Например, вместо числа ввести слово.
#include <iostream>int main() { int age; std::cout << "Введите возраст: "; if (std::cin >> age) { std::cout << "Возраст: " << age << '\n'; } else { std::cout << "Ошибка: необходимо ввести целое число.\n"; } return 0;}Условие if (std::cin >> age) проверяет, удалось ли прочитать значение. Если ввод не соответствует ожидаемому типу, поток переходит в состояние ошибки.
Для простых программ этой проверки часто достаточно. В более сложных приложениях может потребоваться очистить состояние потока и удалить некорректные данные из входного буфера перед повторной попыткой ввода.
Пример: простой калькулятор
Объединим ввод, вычисления и вывод в одной программе.
#include <iostream>int main() { double a; double b; std::cout << "Введите первое число: "; if (!(std::cin >> a)) { std::cout << "Ошибка: некорректное первое число.\n"; return 1; } std::cout << "Введите второе число: "; if (!(std::cin >> b)) { std::cout << "Ошибка: некорректное второе число.\n"; return 1; } std::cout << "Сумма: " << a + b << '\n'; std::cout << "Разность: " << a - b << '\n'; std::cout << "Произведение: " << a * b << '\n'; if (b != 0.0) { std::cout << "Частное: " << a / b << '\n'; } else { std::cout << "Деление на ноль невозможно.\n"; } return 0;}Пример работы:
Введите первое число: 12Введите второе число: 4Сумма: 16Разность: 8Произведение: 48Частное: 3Программа проверяет ввод каждого числа, выполняет арифметические операции и отдельно обрабатывает попытку деления на ноль.
Частые ошибки
Использование необъявленной переменной
std::cin >> age; // Ошибка: age не объявленаПеред использованием переменную нужно объявить:
int age;std::cin >> age;Ввод текста через std::cin >>
std::string name;std::cin >> name;Этот код считывает только первое слово. Для полного имени или другого текста с пробелами используй std::getline.
Неправильный тип данных
int price;std::cin >> price;Если требуется хранить дробное значение, например 12.75, используй double.
Игнорирование ошибки ввода
Если пользователь ввёл слово вместо числа, чтение в переменную числового типа завершится неудачно. Проверяй результат операции ввода, особенно если программа должна корректно обрабатывать неправильные данные.
Забытый заголовок
Для std::cout и std::cin необходим <iostream>, для std::string — <string>, а для std::setprecision — <iomanip>.
Итог
std::coutвыводит информацию в консоль.std::cinсчитывает значения из входного потока.<<передаёт данные в поток вывода, а>>извлекает данные из потока ввода.'\n'переводит вывод на новую строку, аstd::endlдополнительно сбрасывает буфер.std::getlineпозволяет считывать строки, содержащие пробелы.std::fixedиstd::setprecisionпомогают форматировать дробные числа.- Результат ввода нужно проверять, чтобы программа могла обработать некорректные данные.
