使用fstream访问linux用户主目录

时间:2016-02-23 06:51:19

标签: c++ linux

我正在编写小型c ++代码来访问和编辑用户主目录中的某些文本文件。目前我有以下代码(这是相关部分):

bool core(void) {
    std::string autostart_entry = "";
    std::string user_entry = "";
    std::fstream username;
    username.open("username.txt", std::fstream::in);
    std::string location;
    std::string user_name;
    if (username.fail()) {
        username.open("username.txt", std::fstream::out);
        std::cout << "What's your system username? ";
        std::getline(std::cin, user_name);
        username << user_name;
    }
    else
        username >> user_name;
    username.close();
    location = "/home/" + user_name + "/.config/openbox/autostart";
    ...
}

这样,正如你所看到的,我向用户询问他的用户名,并将其附加到位置字符串,有没有简单的方法来查找用户的主目录而不需要用户的输入?我试过&#34;〜/...&#34;它没有用。

我知道我可以扫描&#34; / etc / passwd&#34;文件从那里找到它,但我想知道是否有另一种方式。

2 个答案:

答案 0 :(得分:4)

这里最好的选择可能是使用getenv函数:

#include <stdlib.h>

const char* homeDir = getenv("HOME");

$ HOME环境变量通常总是在linux下设置,它会返回一个字符串到用户主目录(即使它不在/ home下)

编辑:这只适用于运行程序的用户的主目录。如果您希望其他用户使用主目录,则需要使用其他方法

EDIT2:实际上,考虑这个超过1秒......以上都可行,你应该先使用它。但是,如果未设置HOME,则可以使用getpwuid:

#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>

const char *homedir = getenv("HOME");
if ( homedir == NULL ) {
    homedir = getpwuid(getuid())->pw_dir;
}

答案 1 :(得分:1)

如果您想转到主目录,请使用chdir("~")

否则,

这是一个肮脏的黑客,但它的工作原理

#include <unistd.h>
char currdir[100];
char homedir[100];    
getcwd(currdir); //store the current directory in currdir
chdir("~"); // change the working directory to user's home directory
getcwd(homedir); // get the full address
chdir(currdir);   // go back to the previous directory