2016-03-06 48 views
0

我能夠創建文件,如C++ fstream的開放

f.open("file") 
f.open("./path/file") 
f.open("../path/file") 

但不

f.open("~/path...) 
f.open("/path...) 

如何獲得絕對路徑的工作?

+0

'〜'是shell的解釋。這就是爲什麼這不起作用 –

+2

'f.open(「〜/ path ...)'僅僅在shell中支持'解析$ HOME'目錄。不知道爲什麼你的第二個案件不起作用。 –

回答

4

默認情況下,std::fstream::open(filename) 對於輸入和輸出均打開filename。因此該文件必須存在,並且您必須擁有對其的寫入權限 。

在您的情況:

f.open("file") 
f.open("./path/file") 
f.open("../path/file") 

你是幸運的。

你的情況:

f.open("~/path...") 

您使用的路徑元素~,這意味着在外殼$HOME只是 意味着用C++ ~

在這種情況下:

f.open("/path...") 

你倒黴:要麼文件不存在,或者您沒有寫權限。

如果你想打開一個文件,只需輸入然後:

  • 使用std::ifstream
  • 使用std::fstream f; f.open(filename,std::ios_base::in);

如果你想打開一個文件只是輸出則:

  • 使用std::ofstream
  • 使用std::fstream f; f.open(filename,std::ios_base::out);
1

隨着f.open("~/path/....")有必要爲你展開代碼~。通常通過調用getenv("HOME")來檢索主目錄,並用主目錄替換路徑中'~'的每個出現。

使用絕對路徑(例如"/path/whatever")時,您需要檢查f.open()是否成功。 f.open()有各種各樣的原因,包括訪問控制(防止打開文件的保護),文件已被另一個進程打開,目錄不存在等。

值得注意的是,f.open(),當試圖打開目錄中的文件要求路徑中的所有目錄都已存在。它不會運用一些魔法來使它們存在。如果你想要的話,你需要編碼。請記住,每個階段(創建目錄等)可能會失敗。