2017-07-17 140 views
0

在我的程序中,所需資源的一部分是存儲數據的目錄。按照慣例,我決定將此目錄設爲~/.program/。在C++中,使此目錄(在基於UNIX系統),正確的方法是這樣的代碼:在字符串中使用變量

#include <sys/stat.h> 
#include <unistd.h> 
#include <iostream> 

using namespace std; 

void mkworkdir() 
{ 
    if(stat("~/.program",&st) == 0) 
    { 
     cout << "Creating working directory..." << endl; 
     mkdir("~/.program/", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
     mkdir("~/.program/moredata", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
    } 

    else 
    { 
     cout << "Working directory found... continuing" << endl; 
    } 
} 

int main() 
{ 
    mkworkdir(); 
    return 0; 
} 

現在,使用mkdir("~/.program/", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)~是在至少可疑的可靠性,所以我真的想do提示輸入用戶名,將其存儲在string(如string usern; cin >> usern;)中,然後執行mkdir("/home/{$USERN}/.program/", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)(如在shell中)。然而,我不知道如何獲得一些相當於$ USERN的字符串,因爲我不知道如何將一個可擴展的C++構造變成一個字符串。我的意思是,我插入變量的任何「形式」將擴展到該變量的內容到字符串中。

我很抱歉,如果這個問題很混亂,我似乎無法解釋我究竟是什麼。

另外,還有更好的辦法是,可以在不提示的情況下獲取用戶名? (和,其存儲在一個字符串,當然)

回答

4

你可以使用:

std::string usern; 
std::cin >> usern; 
std::string directory = "/home/" + usern + "/.program"; 
mkdir(directory.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 

一個更好的選擇,國際海事組織,是使用環境變量HOME的值。

char const* home = std::getenv("HOME"); 
if (home == nullptr) 
{ 
    // Deal with problem. 
} 
else 
{ 
    std::string directory = home + std::string("/.program"); 
    mkdir(directory.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
} 

FWIW,你可以在你的應用程序的命名空間創建一個函數make_directory簡化代碼,您可以添加檢查目錄是否存在,使用正確的標誌的細節等

namespace MyApp 
{ 
    bool directory_exists(std::string const& directory) 
    { 
     struct stat st; 

     // This is simplistic check. It will be a problem 
     // if the entry exists but is not a directory. Further 
     // refinement is needed to deal with that case. 
     return (stat(directory.c_tr(), &st) == 0);  
    } 

    int make_directory(std::string const& directory) 
    { 
     if (directory_exists(directory)) 
     { 
     return 0; 
     } 
     return mkdir(directory.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
    } 
} 

然後,您可以在您的其他代碼中只使用MyApp::make_directory

char const* home = std::getenv("HOME"); 
if (home == nullptr) 
{ 
    // Deal with problem. 
} 
else 
{ 
    std::string directory = home + std::string("/.program"); 
    MyApp::make_directory(directory); 
    MyApp::make_directory(directory + "/moredata"); 
} 
1

具有usern的用戶名,就可以構建字符串任何你想要的方式:

std::string dir = "/home/" + usern + "/.program/" 

mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 

來獲取用戶名,而不推進高校用戶,你可以使用getlogin_r()

+0

如果只有我能標記兩個答案作爲答案:( –

+0

@DistantGraphics薩胡的答案是好得多,所以不用擔心,乾杯! – Ramon