如何在 C++ 中获取具有文件名的文件的完整路径 (linux)
How to get full path of the file having file name in c++ (linux)
我正在尝试使用 yaml-cpp 解析 yaml 文件,但它需要 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
正如我在评论中所说,我相信您可以使用 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;
}
这取自How do I execute a command and get output of command within C++ using POSIX?
这里只复制代码所以内容也在这里
我正在尝试使用 yaml-cpp 解析 yaml 文件,但它需要 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
正如我在评论中所说,我相信您可以使用 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;
}
这取自How do I execute a command and get output of command within C++ using POSIX?
这里只复制代码所以内容也在这里