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 хостинг.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
m
  • molni99
  • Қаз. 26, 2024, 1:29 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

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

C++ - Тест 003. Условия и циклы

  • Нәтиже:42ұпай,
  • Бағалау ұпайлары-8
Соңғы пікірлер
i
innorwallҚар. 7, 2024, 6:37 Т.Қ.
Qt/C++ - 018-сабақ. QGraphicsItem - мұра және SLOT Generally, Furosemide should be administered intravenously priligy side effects
i
innorwallҚар. 7, 2024, 12:32 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы The hyperinsulinemia of diabetes may also activate sodium hydrogen exchangers in cardiomyocytes leading to injury and loss and in the proximal renal tubules leading to sodium retention can…
i
innorwallҚар. 7, 2024, 12:25 Т.Қ.
Qt WinAPI - Сабақ 003. DLL файлдарын құру үшін windeployqt пайдалану By assisting you in losing water weight, Anavar increases the chances of you losing even more weight priligy where to buy Creatinine was measured by use of a colorimetric assay BioSys…
i
innorwallҚар. 7, 2024, 10:45 Т.Ж.
Linux жүйесінде файлдарды қалай көшіруге болады Microglial antigen presentation is required for antigen specific CD8 T cell infiltration to the brain parenchyma following CNS viral challenge priligy 60 mg One mechanism by which uPA…
i
innorwallҚар. 7, 2024, 8:18 Т.Ж.
Qt/C++ - 023-сабақ. QGraphicsItem элементін тінтуірмен QGraphicsScene бетіне апару In 21 5 procedures, mechanical hemodynamic support was used because of periprocedural hemodynamic instability mostly after year 2010 dapoxetina comprar online
Енді форумда талқылаңыз
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
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 приложения их можно выбрать. В чем может …

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