Как получить полный путь к файлу с именем файла в c ++ (linux) - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь проанализировать файл yaml, используя yaml-cpp, но ему нужен полный путь к файлу file.yaml.Как мне получить этот путь, если он может отличаться в зависимости от настроек пользователя.Я предполагаю, что это имя файла не изменится

Это для кинетической структуры ROS, поэтому она работает на Linux.Я уже пытался получить этот путь с помощью функции system (), но он не возвращает строку.

string yaml_directory = system("echo 'find -name \"file.yaml\"' ") ; // it's not working as expected 
YAML::Node conf_file = YAML::LoadFile("/home/user/path/path/file.yaml"); //I want to change from that string to path found automatically

1 Ответ

0 голосов
/ 06 июля 2019

Как я уже сказал в комментарии, я считаю, что вы можете сделать это с помощью realpath. Как вы сказали, это команда bash. Тем не менее, вы можете выполнить это так

#include <iostream>
#include <stdexcept>
#include <stdio.h>
#include <string>

std::string exec(const char* cmd) {
    char buffer[128];
    std::string result = "";
    FILE* pipe = popen(cmd, "r");
    if (!pipe) throw std::runtime_error("popen() failed!");
    try {
        while (fgets(buffer, sizeof buffer, pipe) != NULL) {
            result += buffer;
        }
    } catch (...) {
        pclose(pipe);
        throw;
    }
    pclose(pipe);
    return result;
}

или с C ++ 11

#include <cstdio>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#include <array>

std::string exec(const char* cmd) {
    std::array<char, 128> buffer;
    std::string result;
    std::unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd, "r"), pclose);
    if (!pipe) {
        throw std::runtime_error("popen() failed!");
    }
    while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
        result += buffer.data();
    }
    return result;
}

Это было взято из Как выполнить команду и получить вывод команды в C ++ с помощью POSIX?

Я только скопировал код здесь, чтобы контент тоже был здесь.

...