2016-10-14 8 views
1

Я писатель ML двигатель и тесты для тестирования различных моделей. Структура проекта выглядит следующим образом:C++ получить абсолютный путь к модели/ресурсу от относительного

- src 
-- model1.cpp 
- test 
-- models 
--- model1.bin 
-- src 
--- model1Test.cpp 

так в моем тестовом файле я знаю относительный путь, который ../models/model1.bin

Мой первый вопрос: как я могу преобразовать его в абсолютный?

И второе. Я использую Clion ide, и когда вы строите проект, он фактически строит его в другом месте, а не там, где находятся источники (например, /home/uuser1/.clion/cache/bla/bla/debug/). И это не копия модели в эту папку. Поэтому, когда я использую boost::filesystem::absolute(relative), он возвращает мне путь от исполняющей точки, а не от исходного. Как с этим бороться?

ответ

1

Вы отвечаете на свой первый вопрос, используйте boost::filesystem::absolute, чтобы получить абсолютный путь от относительного. Вы также можете посмотреть на boost::filesystem::canonical, который удаляет символические ссылки и специальные символы (., ..).

Пути всегда будут относиться к тому, где выполняется ваш исполняемый файл, то есть текущий рабочий каталог, а не путь исполняемого файла. Существует только один способ исправить это последовательно: не используйте относительный путь в вашем коде.

Простым решением является переход пути к каталогу в качестве аргумента командной строки. Следующее описание, ранее описанное в SO Docs, упрощает это.


Опции программы Boost обеспечивают простой и безопасный способ анализа и обработки аргументов командной строки.

#include <boost/program_options.hpp> 
#include <string> 
#include <iostream> 

int main(int argc, char** argv) { 
    namespace po = boost::program_options; 

    po::variables_map vm; 
    po::options_description desc("Allowed Options"); 

    // declare arguments 
    desc.add_options() 
    ("name", po::value<std::string>()->required(), "Type your name to be greeted!"); 

    // parse arguments and save them in the variable map (vm) 
    po::store(po::parse_command_line(argc, argv, desc), vm); 

    std::cout << "Hello " << vm["name"].as<std::string>() << std::endl; 

    return 0; 
} 

Compile и работать с:

$ g++ main.cpp -lboost_program_options && ./a.out --name Batman 
Hello Batman 

Вы можете выводить boost::program_options::options_description объект для печати ожидаемый формат аргумента:

std::cout << desc << std::endl; 

будет производить:

Allowed Options: 
    --name arg    Type your name to be greeted! 

Для быстрого взлома в CLion возможно to set the working directory of your run через Run -> Edit Configurations, хотя я настоятельно рекомендую вам перейти на более постоянное надежное решение &.

Смежные вопросы