Evgenii Legotckoi
Evgenii Legotckoi18 ноября 2018 г. 5:57

Boost - Меню консольной программы с использованием boost::program_options

А вот и статья по boost из моих кое-каких накопившихся материалов. Предлагаю вашему вниманию вариант написания консольной программы с поддержкой консольного меню, которое реализуется с помощью boost::program_options .

boost::program_options отвечает за обработку передаваемых программе аргументов и устанавливает все необходимые переменные без необходимости реализовывать длинную логику из if else веток. Это уже реализуется внутри boost::program_optons .

Предположим, что наша программа будет принимать в качестве аргументов следующие данные

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

Также программа будет иметь меню help, которое и будет данным консольным меню.

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


Структура проекта

Данная программа будет написана с использованием системы сборки CMake, без использования Qt библиотеки . Это будет туториал чисто для boost.

Посмотрим на структуру проекта.

В данном проекте есть

  • CMakeLists.txt -  конфигурационный файл CMake
  • main.cpp - файл с main функцией
  • EApplication.h - заголовочный файл основного класса приложения
  • EApplication.cpp - файл исходных кодов основного класса приложения

Напишем проект с использованием ООП.

CMakeLists.txt

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

Отмечу, что данный проект создавался под операционной системой Linux, поэтому могут быть отличия в настройке под операционной системой Windows или Mac OS.

Также, если у вас не установлен комплект разработки Boost, то например под Ubuntu вы это можете сделать так

sudo apt-get install libboost-all-dev

Посмотрим на настройку проекта

cmake_minimum_required(VERSION 3.12)
project(Menu)

set(CMAKE_CXX_STANDARD 17)

find_package(Boost 1.58.0 COMPONENTS filesystem program_options)

set(SOURCE_FILES
        main.cpp
        EApplication.cpp
        EApplication.h)

if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    add_executable(Menu ${SOURCE_FILES})
    target_link_libraries(Menu ${Boost_LIBRARIES})
endif()

Как видите, я подключил стандарт C++17. В данном случае это не принципиально, можно собрать проект и на стандартах C++11 или C++14.

Здесь указана минимально требуемая версия CMake. Данная версия была установлена у меня на PC.

Потом ищем необходимые нам компоненты boost.

  • filesystem - будем сохранять информацию о файле
  • program_options - для формирования консольного меню

В условии if enfif указаны библиотеки, их заголовочные файлы, а также исходные файлы проекта.

main.cpp

Посмотрим на содержимое файла с main функцией. Там будет создаваться экземпляр приложения и выполняться его метод exec() для запуска основной программной логики.

#include <iostream>

#include "EApplication.h"

int main(int argc, const char* argv[])
{
    EApplication app(argc, argv);
    return app.exec();
}

EApplication.h

А теперь самое интересное, сама программа с консольным меню.

#ifndef MENU_EAPPLICATION_H
#define MENU_EAPPLICATION_H

#include <boost/program_options.hpp>
#include <boost/filesystem/fstream.hpp>

namespace po = boost::program_options;
namespace fs = boost::filesystem;

class EApplication
{
public:
    explicit EApplication(int argc, const char** argv);

    int exec();

private:
    // Описание доступных опций меню
    po::options_description m_desc {"Allowed options"};
    po::variables_map m_vm; // контейнер для сохранения выбранных опций программы

    // Требуемые в программе переменные для работы с опциями меню
    size_t m_blockSize;
    fs::path m_inputFilePath;
    fs::path m_outputFilePath;
};


#endif //MENU_EAPPLICATION_H

EApplication.cpp

#include "EApplication.h"

#include <iostream>

EApplication::EApplication(int argc, const char **argv)
{
    // Добавляем пункты меню
    m_desc.add_options()
            ("help", "produce help message")  // Вызов help справки
            ("input-file,i",  po::value<fs::path>(&m_inputFilePath)->composing(), "set input file path")              // Входной файл, можно записать либо --input-file, либо -i
            ("output-file,o", po::value<fs::path>(&m_outputFilePath)->composing(), "set output file path")            // Выходной файл
            ("block-size,b",  po::value<size_t>(&m_blockSize)->default_value(1024 * 1024), "set block size in bytes") // Размер блока
            ;
    po::store(po::parse_command_line(argc, argv, m_desc), m_vm);  // парсим переданные аргументы
    po::notify(m_vm); // записываем аргументы в переменные в программе
}

int EApplication::exec()
{
    // Если есть запрос на справку
    if (m_vm.count("help"))
    {
        // То выводим описание меню
        std::cout << m_desc << std::endl;
        return 1;
    }

    // Если были введены как минимум входной и выходной параметры
    if (m_vm.count("input-file") && m_vm.count("output-file"))
    {
        // то делаем инициализацию программы, но в данном случае только выводим информацию о введённых параметрах
        std::cout << m_inputFilePath << '\t' << m_outputFilePath << '\t' << m_blockSize << std::endl;
    }
    else
    {
        // В противном случае предлагаем посмотреть справку
        std::cout << "Please, use --help option for information" << std::endl;
        return 1;
    }

    // ToDo something
    // Здесь можем поместить в цикле while() или for(;;) логику программы

    return 0;
}

Выводы

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

Git Repository Link

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
1
  • 12333
  • 18 июля 2024 г. 15:34

Qt - Тест 001. Сигналы и слоты

  • Результат:63баллов,
  • Очки рейтинга-1
1
  • 12333
  • 18 июля 2024 г. 15:25

C++ - Тест 005. Структуры и Классы

  • Результат:50баллов,
  • Очки рейтинга-4
AM

C++ - Тест 005. Структуры и Классы

  • Результат:33баллов,
  • Очки рейтинга-10
Последние комментарии
d
dblas55 июля 2024 г. 21:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr9 февраля 2024 г. 5:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 12:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 21:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 19:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
Сейчас обсуждают на форуме
BlinCT
BlinCT25 июня 2024 г. 11:00
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
Evgenii Legotckoi
Evgenii Legotckoi25 июня 2024 г. 1:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
BlinCT
BlinCT5 мая 2024 г. 15:46
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii Legotckoi3 мая 2024 г. 0:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 апреля 2024 г. 14:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…

Следите за нами в социальных сетях