在字符串中引用 Linux 用户名以打开文件

Reference Linux username in string to open file

提问人:user997112 提问时间:9/10/2018 最后编辑:user997112 更新时间:9/10/2018 访问量:293

问:

我有一个配置文件,其中包含另一个需要打开的文件的路径。此文件路径引用 Linux 用户名:

/root/${USER}/workspace/myfile.txt

其中 $USER 应转换为 Linux 用户名。

这不起作用,因为字符串存储在我的配置文件中,我不能使用 .getenv()

有没有其他方法可以实现这一目标?

C++ 文件-IO IOstream

评论

0赞 jsantander 9/10/2018
en.cppreference.com/w/cpp/utility/program/getenv
0赞 Some programmer dude 9/10/2018
有一些方法可以获取环境变量,并从中构造文件名。
0赞 user997112 9/10/2018
问题是这些字符串是从配置文件中读取的
2赞 jsantander 9/10/2018
好的,在 C/C++ 中寻找变量插值,例如 man7.org/linux/man-pages/man3/wordexp.3.htmlcodereview.stackexchange.com/questions/172644/......
5赞 john 9/10/2018
“我不能使用 getenv” 为什么不呢,是什么阻止了你?仅仅因为$USER只是字符串的一部分,并不能阻止你使用 getenv。

答:

2赞 Galik 9/10/2018 #1

您可以使用 wordexp 来翻译“~”,这是一个表示 HOME 目录的路径元素。像这样的东西:UNIX

#include <wordexp.h>

std::string homedir()
{
    std::string s;
    wordexp_t p;
    if(!wordexp("~", &p, 0))
    {
        if(p.we_wordc && p.we_wordv[0])
            s = p.we_wordv[0];
        wordfree(&p);
    }
    return s;
}

然后从返回的路径中提取用户名。

但我通常这样使用:std::getenv()

auto HOME = std::getenv("HOME"); // may return nullptr
auto USER = std::getenv("USER"); // may return nullptr
2赞 molbdnilo 9/10/2018 #2

获取用户名 ,在路径中替换 。getenv$USER

非常简单的例子:

#include <iostream>
#include <string>
#include <cstdlib>

int main()
{
    std::string path = "/root/$USER/workspace/myfile.txt";
    const char* user = std::getenv("USER");
    int pos = path.find("$USER");
    if (user != nullptr && pos >= 0)
    {
        path.replace(pos, 5, user);
        std::cout << path << std::endl;
    }
}