【问题标题】:Reference Linux username in string to open file在字符串中引用 Linux 用户名以打开文件
【发布时间】:2019-02-14 18:41:42
【问题描述】:

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

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

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

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

还有其他方法可以实现吗?

【问题讨论】:

标签: c++ file-io iostream


【解决方案1】:

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

#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】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 2011-06-08
      相关资源
      最近更新 更多