Статьи

Учебные материалы по языку C++ — от основ до продвинутых тем

Ввод и вывод в C++

Страница 9 из 43 · 2026-10-25 · 8 мин чтения

Ввод и вывод

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

В 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

Последовательность действий:

  1. Объявляется переменная age.
  2. Программа просит пользователя ввести значение.
  3. std::cin >> age считывает целое число.
  4. Полученное значение сохраняется в переменной.
  5. Программа выводит результат.

Ввод нескольких значений

Можно считывать несколько значений в одной инструкции, разделяя их пробелами или переводами строки.

#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 помогают форматировать дробные числа.
  • Результат ввода нужно проверять, чтобы программа могла обработать некорректные данные.