Evgenii Legotckoi
Evgenii LegotckoiҚар. 18, 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 хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

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

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

Бізді әлеуметтік желілерде бақылаңыз