Evgenii Legotckoi
Қар. 18, 2018, 4: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 вы это можете сделать так

  1. sudo apt-get install libboost-all-dev

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

  1. cmake_minimum_required(VERSION 3.12)
  2. project(Menu)
  3.  
  4. set(CMAKE_CXX_STANDARD 17)
  5.  
  6. find_package(Boost 1.58.0 COMPONENTS filesystem program_options)
  7.  
  8. set(SOURCE_FILES
  9. main.cpp
  10. EApplication.cpp
  11. EApplication.h)
  12.  
  13. if(Boost_FOUND)
  14. include_directories(${Boost_INCLUDE_DIRS})
  15. add_executable(Menu ${SOURCE_FILES})
  16. target_link_libraries(Menu ${Boost_LIBRARIES})
  17. endif()

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

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

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

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

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

main.cpp

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

  1. #include <iostream>
  2.  
  3. #include "EApplication.h"
  4.  
  5. int main(int argc, const char* argv[])
  6. {
  7. EApplication app(argc, argv);
  8. return app.exec();
  9. }

EApplication.h

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

  1. #ifndef MENU_EAPPLICATION_H
  2. #define MENU_EAPPLICATION_H
  3.  
  4. #include <boost/program_options.hpp>
  5. #include <boost/filesystem/fstream.hpp>
  6.  
  7. namespace po = boost::program_options;
  8. namespace fs = boost::filesystem;
  9.  
  10. class EApplication
  11. {
  12. public:
  13. explicit EApplication(int argc, const char** argv);
  14.  
  15. int exec();
  16.  
  17. private:
  18. // Описание доступных опций меню
  19. po::options_description m_desc {"Allowed options"};
  20. po::variables_map m_vm; // контейнер для сохранения выбранных опций программы
  21.  
  22. // Требуемые в программе переменные для работы с опциями меню
  23. size_t m_blockSize;
  24. fs::path m_inputFilePath;
  25. fs::path m_outputFilePath;
  26. };
  27.  
  28.  
  29. #endif //MENU_EAPPLICATION_H

EApplication.cpp

  1. #include "EApplication.h"
  2.  
  3. #include <iostream>
  4.  
  5. EApplication::EApplication(int argc, const char **argv)
  6. {
  7. // Добавляем пункты меню
  8. m_desc.add_options()
  9. ("help", "produce help message") // Вызов help справки
  10. ("input-file,i", po::value<fs::path>(&m_inputFilePath)->composing(), "set input file path") // Входной файл, можно записать либо --input-file, либо -i
  11. ("output-file,o", po::value<fs::path>(&m_outputFilePath)->composing(), "set output file path") // Выходной файл
  12. ("block-size,b", po::value<size_t>(&m_blockSize)->default_value(1024 * 1024), "set block size in bytes") // Размер блока
  13. ;
  14. po::store(po::parse_command_line(argc, argv, m_desc), m_vm); // парсим переданные аргументы
  15. po::notify(m_vm); // записываем аргументы в переменные в программе
  16. }
  17.  
  18. int EApplication::exec()
  19. {
  20. // Если есть запрос на справку
  21. if (m_vm.count("help"))
  22. {
  23. // То выводим описание меню
  24. std::cout << m_desc << std::endl;
  25. return 1;
  26. }
  27.  
  28. // Если были введены как минимум входной и выходной параметры
  29. if (m_vm.count("input-file") && m_vm.count("output-file"))
  30. {
  31. // то делаем инициализацию программы, но в данном случае только выводим информацию о введённых параметрах
  32. std::cout << m_inputFilePath << '\t' << m_outputFilePath << '\t' << m_blockSize << std::endl;
  33. }
  34. else
  35. {
  36. // В противном случае предлагаем посмотреть справку
  37. std::cout << "Please, use --help option for information" << std::endl;
  38. return 1;
  39. }
  40.  
  41. // ToDo something
  42. // Здесь можем поместить в цикле while() или for(;;) логику программы
  43.  
  44. return 0;
  45. }

Выводы

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

Git Repository Link

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

Пікірлер

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