<MyRusakov.ru />

Программирование на C++ в Unreal Engine 5

Программирование на C++ в Unreal Engine 5

Данный курс научит Вас созданию игр на C++ в Unreal Engine 5. Курс состоит из 12 разделов, в которых Вас ждёт теория и практика. Причём, в качестве практики будет создан весьма крупный проект объёмом свыше 5000 строк качественного кода, который уже на практике познакомит Вас с принципами создания игр на C++ в Unreal Engine 5.

Параллельно с курсом Вы также будете получать домашние задания, результатом которых станет, в том числе, полноценная серьёзная работа для портфолио.

Помимо самого курса Вас ждёт ещё и очень ценный Бонус: «Тестирование Unreal-проектов на Python», в рамках которого Вы научитесь писать очень полезные тесты для тестирования самых разных аспектов разработки игр.

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Ввод и вывод в C++: cin, cout, getline — практическое руководство с примерами и ошибками

Ввод и вывод в C++: cin, cout, getline — практическое руководство с примерами и ошибками

Ввод и вывод — первое, с чем сталкивается каждый, кто пишет на C++. Но именно здесь чаще всего случаются «странные» баги: не читаются строки с пробелами, числа форматируются не так, как ожидалось, программа «зависает» после ввода и т. д. В этом руководстве мы разложим по полочкам std::cout, std::cin, std::getline, форматирование и ускорение I/O, а также дадим готовые рецепты.

Быстрый старт: cout и cin

Вывод через cout — потоковый и «склеиваемый», а endl — перевод строки с принудительной очисткой буфера (часто медленнее, чем '\n').

#include <iostream>

int main() {
    std::cout << "Hello, C++!\n";      // Быстрее, чем std::endl
    int a, b;
    std::cout << "Введите два числа: ";
    std::cin >> a >> b;                 // Пробелы/переводы строки — разделители
    std::cout << "Сумма: " << (a + b) << '\n';
}

Совет: используйте '\n' вместо std::endl, когда не нужен немедленный сброс буфера — это заметно ускоряет вывод в циклах.

Чтение строк с пробелами: getline

std::cin >> x читает до пробела. Чтобы прочитать целую строку (включая пробелы), используйте std::getline. Важно: после числового ввода в буфере остаётся символ перевода строки, который нужно убрать.

#include <iostream>
#include <string>
#include <limits>

int main() {
    int age;
    std::string fullName;

    std::cout << "Возраст: ";
    std::cin >> age;                      // Оставляет '\n' в буфере

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    // Альтернатива: std::getline(std::cin >> std::ws, fullName);

    std::cout << "Полное имя: ";
    std::getline(std::cin, fullName);     // Читает строку с пробелами

    std::cout << "Здравствуйте, " << fullName 
              << ". Вам " << age << " лет.\n";
}

Два надёжных способа убрать «висящий» перевод строки перед getline:

  • std::cin.ignore(numeric_limits::max(), '\n') — очистить до конца строки
  • std::getline(std::cin >> std::ws, s) — пропустить начальные пробелы/переводы перед чтением

Форматирование вывода: iomanip и флаги

Манипуляторы позволяют гибко управлять форматированием чисел и текста.

#include <iostream>
#include <iomanip>   // setw, setfill, fixed, setprecision, boolalpha

int main() {
    double x = 3.1415926535;
    bool ok = true;

    std::cout << std::fixed << std::setprecision(2) << x << '\n'; // 3.14
    std::cout << std::scientific << std::setprecision(3) << x << '\n';

    std::cout << std::boolalpha << ok << '\n';         // true вместо 1

    std::cout << std::left  << std::setw(10) << "Name"
              << std::right << std::setw(6)  << "Age" << '\n';
    std::cout << std::setfill('-') << std::setw(16) << "" << '\n';
    std::cout << std::setfill(' ') << std::left << std::setw(10) << "Alex"
              << std::right << std::setw(6) << 28 << '\n';
}

Частая ошибка: забывают вернуть стандартные флаги после изменения. Например, после scientific вернуть fixed при необходимости.

std::format (C++20): современное форматирование

Если ваш компилятор поддерживает C++20, можно использовать std::format — знакомый синтаксис «скобок» и высокая скорость.

#include <format>
#include <iostream>

int main() {
    std::string s = std::format("Привет, {}! Точность: {:.3f}", "мир", 3.14159);
    std::cout << s << '\n';
}

Нет std::format? Рассмотрите библиотеку {fmt} как зависимость: она лежит в основе стандарта и работает на старших С++.

Ускорение консольного I/O

По умолчанию iostream синхронизирован со stdio (printf/scanf), что замедляет работу. Если вы используете только iostream — отключите синхронизацию и развяжите потоки.

#include <iostream>

int main() {
    std::ios::sync_with_stdio(false); // Отключить синхронизацию с stdio
    std::cin.tie(nullptr);            // Не ждать flush cout перед чтением

    // Ваш быстрый ввод/вывод
}

Важное правило: после отключения синхронизации не смешивайте iostream с printf/scanf в одной программе.

Надёжное чтение чисел с валидацией

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

#include <iostream>
#include <limits>

int main() {
    int n;
    while (true) {
        std::cout << "Введите целое число: ";
        if (std::cin >> n) break;                 // Успех
        std::cin.clear();                         // Сбросить failbit
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "Ошибка ввода. Повторите.\n";
    }
    std::cout << "Вы ввели: " << n << '\n';
}

Локали и кодировки (коротко)

Формат чисел и правила ввода/вывода зависят от локали. Для iostream используйте imbue, но поведение платформозависимо. Для простых учебных задач лучше оставаться на локали по умолчанию и явно управлять форматированием.

#include <iostream>
#include <locale>

int main() {
    std::locale ru("ru_RU.UTF-8"); // Может потребоваться установка пакетов локалей в ОС
    std::cout.imbue(ru);
    std::cin.imbue(ru);
    // ...
}

Мини‑практика: анкета с аккуратным вводом и красивым выводом

#include <iostream>
#include <iomanip>
#include <string>
#include <limits>

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    std::string fullName, city;
    int age;
    double score;

    std::cout << "Полное имя: ";
    std::getline(std::cin >> std::ws, fullName);

    std::cout << "Город: ";
    std::getline(std::cin, city);

    while (true) {
        std::cout << "Возраст (целое): ";
        if (std::cin >> age) break;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "Нужно целое число.\n";
    }

    while (true) {
        std::cout << "Средний балл (дробное): ";
        if (std::cin >> score) break;
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "Нужно число.\n";
    }

    std::cout << '\n' << std::left  << std::setw(12) << "Имя" 
              << std::setw(12) << "Город" 
              << std::right << std::setw(8) << "Возраст" 
              << std::setw(10) << "Бал" << '\n';
    std::cout << std::setfill('-') << std::setw(42) << "" << '\n' << std::setfill(' ');

    std::cout << std::left  << std::setw(12) << fullName
              << std::setw(12) << city
              << std::right << std::setw(8)  << age
              << std::setw(10) << std::fixed << std::setprecision(2) << score << '\n';
}

Частые ошибки и как их избежать

  • Смешивание cin и getline без очистки буфера — добавляйте ignore или std::ws
  • Использование endl в циклах — заменяйте на '\n' для скорости
  • Отсутствие проверки cin после ввода числа — валидируйте и очищайте ошибки
  • Смешивание iostream и printf/scanf после отключения синхронизации — не делайте так
  • Забытые манипуляторы (scientific/fixed, fill) — возвращайте нужные флаги явно

Что дальше?

Отточив базовый I/O, вы быстрее двинетесь к алгоритмам, контейнерам и реальным проектам. Если хотите пройти путь системно с практикой и фидбеком, рекомендую посмотреть Пошаговый курс «Программирование на C++ с Нуля до Гуру» с практическими заданиями — отличный способ закрыть пробелы и уверенно двигаться дальше.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (https://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: https://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: https://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.