Перейти к основному содержимому

Простые приложения на C++

Разработчику Архитектору

Простые приложения на C++

C++ сочетает низкоуровневое управление памятью с абстракциями стандартной библиотеки. Ниже — практические консольные примеры: от строк и файлов до сокетов и RAII. Каждый блок можно собрать отдельно; общая линия — показать, как идеи из синтаксиса и пунктуации и основ раздела выглядят в рабочем коде.

Все примеры ориентированы на C++17 и новее (std::filesystem, умные указатели, std::optional там, где уместно). Код с сокетами (sys/socket.h) рассчитан на Unix-подобные ОС; на Windows нужны winsock2 и иные заголовки — в учебных целях это сознательное упрощение.


Навигация по примерам

ПримерЧто отрабатывается
Генератор паролейstd::string, <random>, reserve
Сортировщик файлапотоки, std::vector, std::sort
Калькуляторswitch, исключения
Трекер задач JSONструктуры, сериализация (библиотека JSON)
HTTP-сервер и клиентсокеты, строки как протокол
HTTP-запросысборка запроса, буфер ответа
Сканер директорийstd::filesystem, рекурсия
Резервное копированиеfs::copy, обработка error_code
Мониторинг дискаspace(), форматирование вывода
Парсер URLstd::regex, сеть
Конвертер датstringstream, iomanip
Список процессовусловная компиляция _WIN32
RAII и unique_ptrвладение ресурсом, move-семантика

Перед сетевыми примерами полезно повторить типы данных в C++ и блок про RAII в конце этой статьи; в продакшене чаще берут Boost.Asio или готовые HTTP-библиотеки, а не сырой socket API.


Как запускать примеры из главы

  1. Сохраните один пример в имя.cpp (один main на файл).
  2. Linux/macOS: g++ -std=c++17 -O2 -Wall имя.cpp -o app && ./app
  3. Windows (MSVC): cl /EHsc /std:c++17 имя.cppимя.exe
  4. CMake: для крупных фрагментов удобнее отдельный CMakeLists.txt с target.

У каждого раздела — блок Как запустить (где добавлен).


Генератор паролей

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


Как запустить

  • Файл: password.cpp
  • Команда: g++ -std=c++17 password.cpp -o password && ./password
  • Результат: сгенерированный пароль в stdout.

Описание задачи

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


Код программы

Код ITЗагрузка примера кода…


Разбор ключевых элементов

  • std::mt19937: Псевдослучайный генератор чисел, обеспечивающий равномерное распределение значений.
  • std::uniform_int_distribution: Распределяет целые числа в заданном диапазоне, исключая смещения.
  • std::string::reserve: Заранее выделяет память под строку, что повышает производительность при многократном добавлении символов.
  • Инициализация семени: Использование high_resolution_clock гарантирует уникальность последовательности при каждом запуске.

Сортировщик текстового файла

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


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Программа считывает все строки из входного файла, сортирует их лексикографически и сохраняет результат в выходной файл.


Код программы

Код ITЗагрузка примера кода…


Разбор ключевых элементов

  • std::getline: Чтение строки до символа переноса строки, корректно обрабатывает файлы с разными типами переносов.
  • std::vector: Динамический массив для хранения строк произвольного размера.
  • std::sort: Алгоритм быстрой сортировки из STL, работающий за O(N log N).
  • Обработка ошибок: Проверка состояния потоков ввода/вывода перед началом операций.

Консольный калькулятор

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


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Пользователь вводит два числа и знак операции (+, -, *, /). Программа выводит результат или сообщение об ошибке.


Код программы

Код ITЗагрузка примера кода…


Разбор ключевых элементов

  • switch-case: Эффективная структура для выбора действия по значению переменной.
  • Исключения (try-catch): Обработка некорректных операций (деление на ноль, неверный символ).
  • Типы данных: Использование double позволяет работать с дробными числами.

Трекер задач в JSON

Пример сериализации и десериализации структуры данных в формат JSON с сохранением в файл. Для реализации используется библиотека nlohmann/json, которая является стандартом де-факто для работы с JSON в C++.


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Программа хранит список задач (ID, описание, статус) в JSON-файле. Поддерживается добавление новых задач и вывод текущего списка.


Код программы

Примечание: Для компиляции требуется подключить библиотеку nlohmann/json.

Код ITЗагрузка примера кода…


Разбор ключевых элементов

  • Структура данных: struct Task определяет схему записи.
  • JSON-парсинг: Библиотека автоматически преобразует C++ объекты в структуру JSON и обратно.
  • Управление состоянием: Методы load и save обеспечивают постоянство данных между запусками программы.

Простой HTTP-сервер и клиент

C++ не имеет встроенной поддержки HTTP в стандартной библиотеке, поэтому для сетевых операций используются сокеты. Ниже представлен минимальный сервер, принимающий запросы, и клиент, отправляющий их.


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Сервер слушает порт 8080 и возвращает текст "Hello, World!" на любой GET-запрос. Клиент отправляет этот запрос и выводит ответ.


Код сервера

Код ITЗагрузка примера кода…


Код клиента

Код ITЗагрузка примера кода…


Разбор ключевых элементов

  • Сокеты (socket, bind, listen, accept): Базовый API Unix/Linux для сетевого взаимодействия.
  • Текстовый протокол: Формирование HTTP-заголовков вручную через конкатенацию строк.
  • Асинхронность: Сервер работает в цикле, обрабатывая клиентов последовательно (для демонстрации).

Отправитель HTTP-запросов

Утилита для отправки произвольных HTTP-запросов с возможностью указания заголовков и тела запроса.


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Программа принимает URL, метод запроса (GET, POST), заголовки и тело, отправляет данные и выводит ответ.


Код программы

Код ITЗагрузка примера кода…

Разбор:

  • socket/connect создают TCP-соединение с удаленным хостом и портом.
  • std::ostringstream requestStream пошагово формирует HTTP-запрос с методом, путем и заголовками.
  • Content-Length вычисляется из body.length(), чтобы сервер корректно прочитал тело запроса.
  • Цикл recv накапливает ответ частями, потому что TCP не гарантирует получение всего ответа одним чтением.
  • Метод возвращает сырую HTTP-строку (статус, заголовки, тело), что удобно для диагностики протокола.

Утилита для сканирования директорий

Программа рекурсивно обходит папку и выводит список всех файлов и подпапок с указанием их размеров.


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Пользователь указывает путь к директории. Программа выводит дерево файлов с размерами.


Код программы

Код ITЗагрузка примера кода…


Разбор ключевых элементов

  • std::filesystem: Современная библиотека для работы с файловой системой, введенная в C++17.
  • Рекурсия: Функция вызывает сама себя для обработки вложенных директорий.
  • Итераторы: directory_iterator позволяет проходить по элементам каталога без ручного управления указателями.

Скрипт для создания резервного копирования файлов

Программа копирует файлы из исходной папки в целевую, сохраняя структуру директорий и временные метки.


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Создает полную копию указанной папки в новое место назначения.


Код программы

Код ITЗагрузка примера кода…

Разбор:

  • fs::exists(source) валидирует исходный путь до старта копирования.
  • fs::create_directories(dest.parent_path()) заранее создает недостающий путь назначения.
  • fs::copy(... recursive | overwrite_if_newer, ec) копирует дерево каталогов и обновляет только устаревшие файлы.
  • Использование std::error_code ec позволяет обработать ошибку без исключений.
  • Возврат bool превращает функцию в явный контракт "успех/ошибка" для вызывающего кода.

Мониторинг дискового пространства

Утилита выводит информацию о свободном и занятом месте на дисках системы.


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Отображает объем диска, свободное место и процент использования.


Код программы

Код ITЗагрузка примера кода…

Разбор:

  • fs::space(root) возвращает агрегированную информацию о томе: общий, свободный и доступный объем.
  • used = total - free вычисляет занятое пространство на диске.
  • static_cast<double>(used) / total переводит расчет процента в вещественную арифметику.
  • std::fixed << std::setprecision(2) форматирует процент использования с двумя знаками после запятой.
  • Условная компиляция _WIN32 выбирает корректный корневой путь для Windows и Unix-систем.

Парсер URL и проверка доступности ресурса

Программа анализирует URL, извлекает компоненты (протокол, хост, порт, путь) и проверяет доступность ресурса через HTTP.


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Пользователь вводит URL. Программа выводит его составные части и статус доступа (код ответа HTTP).


Код программы

Код ITЗагрузка примера кода…

Разбор:

  • std::regex и std::regex_match извлекают схему, хост, порт и путь из URL по шаблону.
  • std::stoi преобразует текстовый порт в int, если порт явно указан в строке.
  • checkAvailability устанавливает TCP-соединение и отправляет минимальный HTTP GET запрос.
  • Из ответа берется статус-код, после чего диапазон 200-399 трактуется как доступность ресурса.
  • Пример показывает базовый сетевой pipeline, но для HTTPS и DNS-имен в проде нужен более полный стек.

Конвертер форматов дат

Утилита преобразует дату из одного формата в другой (например, из строки "DD.MM.YYYY" в "YYYY-MM-DD").


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Программа принимает дату в формате пользователя и конвертирует её в ISO 8601 формат.


Код программы

Код ITЗагрузка примера кода…

Разбор:

  • std::stringstream парсит входную строку по разделителю и извлекает день, месяц и год.
  • DateParts фиксирует структуру даты как тип, а не набор разрозненных переменных.
  • std::ostringstream собирает новую строку в формате ISO (YYYY-MM-DD).
  • std::setw(2) и std::setfill('0') обеспечивают ведущие нули для месяца и дня.
  • Разделение на parseDate и convertToISO делает код проще для тестирования по шагам.

Утилита для просмотра запущенных процессов

Программа выводит список активных процессов с их идентификаторами (PID) и именами.


Как запустить

  • Файл: отдельный .cpp с одним main из примера (имя по разделу).
  • Команда: g++ -std=c++17 файл.cpp -o app && ./app
  • Результат: см. вывод std::cout в конце примера.

Описание задачи

Отображает текущие процессы, работающие в системе.


Код программы

Код ITЗагрузка примера кода…

Разбор:

  • #ifdef _WIN32 разделяет реализацию под Windows и Unix, сохраняя единый внешний API.
  • В Windows используется CreateToolhelp32Snapshot и перебор через Process32First/Process32Next.
  • В Linux чтение /proc и фильтрация numeric-имен каталогов позволяет получить PID процессов.
  • Файл /proc/<pid>/stat содержит имя процесса, которое очищается от скобок перед выводом.
  • Такой пример демонстрирует системное программирование и платформенные различия в одном интерфейсе.

Характерный пример именно для C++ — Управление памятью и RAII

Одной из отличительных черт C++ является управление ресурсами через механизм RAII (Resource Acquisition Is Initialization). Это позволяет автоматизировать освобождение памяти и других ресурсов, предотвращая утечки.

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


Код программы

Код ITЗагрузка примера кода…


Разбор ключевых элементов

  • Конструктор и деструктор: Гарантируют выделение и освобождение ресурсов в строго определенном порядке.
  • Запрет копирования: Предотвращает создание двух объектов, указывающих на одну область памяти.
  • Перемещение (Move Semantics): Позволяет эффективно передавать владение объектом без копирования данных.
  • std::unique_ptr: Автоматизирует управление памятью, используя принцип RAII.

Как двигаться дальше

После разбора примеров имеет смысл перейти к справочнику по C++, темам про шаблоны и современный стандарт (C++20/23), а для сетевого и многопоточного кода — к библиотекам уровня Boost, libcurl или фреймворкам вроде Qt. Консольные утилиты из этой статьи — учебный фундамент, а не рекомендация писать HTTP-сервер вручную в промышленном проекте.


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.

Содержание