Вам нужно найти домашний каталог пользователя. Для этого используйте getpwent
, чтобы получить запись пользователя и оттуда домашний каталог. Затем добавьте остаток пути к вашему XML-файлу /myuserprojectdir/xmlfilename.xml
к полученному значению.
Это будет работать, даже если домашний каталог пользователя не /home/$USER
. Он работает на Linux и OSX и, вероятно, будет работать на Windows с cygwin .
Вот рабочий пример с проверкой ошибок, опущенной для ясности :
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
main()
{
char* user = getlogin();
struct passwd* userrecord;
while((userrecord = getpwent()) != 0)
if (0 == strcmp(user, userrecord->pw_name))
printf("save file is %s/myuserprojectdir/xmlfilename.xml\n", userrecord->pw_dir);
}
выход:
save file is /Users/alex/myuserprojectdir/xmlfilename.xml
Вот как это работает (с man getpwent
):
struct passwd * getpwent(void);
// The getpwent() function sequentially reads the password database and is intended for programs that wish to
process the complete list of users.
struct passwd {
char *pw_name; /* user name */ // <<----- check this one
char *pw_passwd; /* encrypted password */
uid_t pw_uid; /* user uid */
gid_t pw_gid; /* user gid */
time_t pw_change; /* password change time */
char *pw_class; /* user access class */
char *pw_gecos; /* Honeywell login info */
char *pw_dir; /* home directory */ // <<----- read this one
char *pw_shell; /* default shell */
time_t pw_expire; /* account expiration */
int pw_fields; /* internal: fields filled in */
};
Чтобы получить имя пользователя, используйте getlogin
... вот фрагмент из man getlogin
.
char * getlogin(void);
// The getlogin() routine returns the login name of the user associated with the current session ...