使用 fstream 访问 Linux 用户主目录

3
我正在编写一段小的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";
    ...
}

这样,正如你所看到的,我要求用户提供用户名,并将其附加到位置字符串中。有没有一种简单的方法可以找到用户的主目录而不需要询问用户?我尝试过“~ / ...”,但它不起作用。
我知道我可以扫描“/ etc / passwd”文件以从那里找到它,但我想知道是否还有其他方法。

默认情况下,目录位于/home/user_name,但不一定如此。最好读取/etc/passwd。 - Pooya
您不需要询问用户的用户名。在Linux系统中,可以使用chdir来完成相同的操作。请查看下面的答案以获取完整的披露。如果有帮助,请接受!;) - gokul_uf
2个回答

8

在这里,您最好使用getenv函数:

#include <stdlib.h>

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

$HOME环境变量在Linux下通常都是设置好的,它会返回用户的主目录字符串(即使它不在/home下)。

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

编辑2:实际上,仔细思考了一秒钟以上,上面的方法将起作用,并且应该首先使用它。但是,如果没有设置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;
}

两种方法都给了我“/”而不是“/home/MY_USERNAME”,尽管我在系统中以我的用户身份登录,而不是root。 你知道可能是什么问题吗? - George Dirac
不是真的;我在我的Linux机器上都运行了,两个都可以工作。您可以在运行应用程序之前在终端中键入“echo $HOME”来检查是否设置了HOME,但它应该已经设置好了。您是通过命令行还是通过IDE运行应用程序? - Signal Eleven
我运行了“echo $HOME”,它输出了正确的路径。我正在使用命令行运行我的应用程序,与我运行“echo $HOME”的命令行相同。 - George Dirac
嗯,我不确定发生了什么。getenv函数应该可以工作;它可用于所有环境变量(包括HOME),因此您可以测试是否也可以获取其他变量...但是如果$HOME已定义,则getenv()确实应该起作用。奇怪的是,getenv和getpwuid都返回相同的内容,并且都不正确;我不知道该建议什么。重新编译时是否有任何警告?(我真的在试探...) - Signal Eleven
1
非常抱歉,我搞砸了。getenv 函数运行得很好,只是当我想要显示 homedir 的值时,我使用了 "std::cout << *homedir;" 这个语句,显然只输出了第一个字符,即 "/"。这是我的错误,感谢您提供的解决方案! - George Dirac

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

谢谢这个建议,我会使用"getenv("HOME")"的解决方案,因为它看起来更简洁。 - George Dirac
运行 chdir("~") 只需要一个函数调用 ;) - gokul_uf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接