Простые приложения на 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(), форматирование вывода |
| Парсер URL | std::regex, сеть |
| Конвертер дат | stringstream, iomanip |
| Список процессов | условная компиляция _WIN32 |
RAII и unique_ptr | владение ресурсом, move-семантика |
Перед сетевыми примерами полезно повторить типы данных в C++ и блок про RAII в конце этой статьи; в продакшене чаще берут Boost.Asio или готовые HTTP-библиотеки, а не сырой socket API.
Как запускать примеры из главы
- Сохраните один пример в
имя.cpp(одинmainна файл). - Linux/macOS:
g++ -std=c++17 -O2 -Wall имя.cpp -o app && ./app - Windows (MSVC):
cl /EHsc /std:c++17 имя.cpp→имя.exe - 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 как основа веб-интеграций.