Evgenii Legotckoi
Evgenii Legotckoi18. November 2018 05:57

Boost - Konsolenprogrammmenü mit boost::program_options

Und hier ist ein Artikel über Boost aus einigen meiner gesammelten Materialien. Ich mache Sie auf eine Variante aufmerksam, ein Konsolenprogramm mit Unterstützung für das Konsolenmenü zu schreiben, das mit boost::program_options implementiert wird.

boost::program_options ist verantwortlich für die Verarbeitung der an das Programm übergebenen Argumente und das Setzen aller notwendigen Variablen, ohne langwierige Logik aus if else -Zweigen implementieren zu müssen. Dies ist bereits in boost::program_optons implementiert.

Angenommen, unser Programm nimmt die folgenden Daten als Argumente

  • Pfad zur Eingabedatei
    *Pfad zur Ausgabedatei
  • die Größe des verarbeiteten Blocks, egal was, wir werden nichts damit machen, es gibt nur einen solchen Parameter im Programm.

Das Programm wird auch ein Hilfemenü haben, das dieses Konsolenmenü sein wird.

Die folgende Abbildung zeigt ein Beispiel für die Verwendung dieses Programms.


Projektstruktur

Dieses Programm wird mit dem CMake-Buildsystem geschrieben, ohne die Qt-Bibliothek zu verwenden. Dies wird ein reines Tutorial für Boost sein.

Schauen wir uns die Struktur des Projekts an.

Dieses Projekt hat

  • CMakeLists.txt - CMake-Konfigurationsdatei
  • main.cpp - Datei mit main-Funktion
  • EApplication.h - Header-Datei der Hauptanwendungsklasse
  • EApplication.cpp - Quellcodedatei der Hauptanwendungsklasse

Schreiben wir ein Projekt mit OOP.

CMakeLists.txt

Lassen Sie uns zunächst die Projektkonfiguration behandeln, da dieses Projekt mit der Boost-Bibliothek geschrieben wurde, muss es konfiguriert werden, damit es funktioniert.

Ich nehme zur Kenntnis, dass dieses Projekt unter dem Betriebssystem Linux erstellt wurde, daher kann es zu Unterschieden in den Einstellungen unter dem Betriebssystem Windows oder Mac OS kommen.

Wenn Sie das Boost-Entwicklungskit nicht installiert haben, können Sie dies beispielsweise unter Ubuntu so tun

sudo apt-get install libboost-all-dev

Schauen wir uns den Projektaufbau an

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()

Wie Sie sehen können, habe ich den C++17-Standard eingebunden. In diesem Fall spielt es keine Rolle, Sie können das Projekt auf C++11- oder C++14-Standards aufbauen.

Dies ist die mindestens erforderliche Version von CMake. Diese Version wurde auf meinem PC installiert.

Dann suchen wir nach den Boost-Komponenten, die wir brauchen.

  • Dateisystem - Wir speichern Informationen über die Datei
  • program_options - um das Konsolenmenü zu bilden

Die Bedingung if enfif gibt Bibliotheken, ihre Header-Dateien und Projektquelldateien an.

main.cpp

Schauen wir uns den Inhalt der Datei mit der Funktion main an. Dort wird eine Anwendungsinstanz erstellt und ihre Methode exec() wird ausgeführt, um die Hauptprogrammlogik auszuführen.

#include <iostream>

#include "EApplication.h"

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

EApplication.h

Und jetzt das Interessanteste, das Programm selbst mit dem Konsolenmenü.

#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;
}

Schlussfolgerungen

Diese boost::program_options -Bibliothek ist wirklich sehr nützlich und ermöglicht es Ihnen, viele Probleme beim Schreiben eines Konsolenmenüs zu beseitigen. Zumindest ermöglicht es Ihnen, sehr kompakten Code zu schreiben und Menüs sehr schnell in eine Konsolenanwendung einzubetten.

Git-Repository-Link

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken