2015-05-23 55 views
2

我寫了一個簡單的程序來複制文件。 它得到兩個字符串:C++代碼:困惑的相對地址(波浪)

1)用於源文件的路徑。

2)用於複製文件的名稱。

當我給它絕對或相對路徑(沒有波浪號(〜))時,它可以正常工作。

但是,當我給它一個帶波形符號(〜)的相對路徑時,它找不到文件的地址。這讓我感到困惑!

這是我的樣本輸入:

1)/Users/mahan/Desktop/Copy.cpp

2)〜/桌面/ Copy.cpp

第一個正常工作,但第二個沒有。

這裏是我的代碼:

#include <iostream> 
#include <fstream> 
using namespace std; 

int main() 
{ 
    string path, copy_name; 
    cin >> path >> copy_name; 
    ifstream my_file; 
    ofstream copy(copy_name); 
    my_file.open(path); 
    if(my_file.is_open()) 
    { 
     copy << my_file.rdbuf(); 
     copy.close(); 
     my_file.close(); 
    } 
} 

回答

5

~由您使用的是汽車外殼處理擴展到您的$HOME目錄。

std::ofstream不處理文件路徑中的~字符,因此只有您的第一個示例有效。


如果您使用argv[1]傳遞命令行中的文件路徑到您的程序,並從你的shell調用它,你會得到~自動擴展。


用什麼上面說的,如果你想自己擴大~字符,你可以使用std::getenv()函數來確定的$HOME值,並用該值替換它。

+0

不應該是:「[...]因此只有您的_first_示例有效。」? –

+0

@BrunoParmentier當然,是THX指出了。下次可以隨意提出編輯。 –

+0

請注意,用戶可以修改HOME環境變量。'getpwuid(getuid());'返回的'struct passwd'中的'pw_dir'條目不能被用戶修改。 –

0

第二個示例不起作用,因爲shell將~替換爲$HOME,即您的主目錄的路徑。

fstream對象將不會執行此替換,而是會查找實際名爲~的目錄,而該目錄可能不存在於您的工作目錄中。

0

std::ofstream無法處理~。這是您的home目錄的快捷方式。您需要提供home的絕對路徑或相對於代碼運行目錄的相對路徑才能工作。

給出相對路徑,例如,如果您在Desktop目錄中運行您的代碼,則不需要給~/Desktop/Copy.cpp。只要給Copy.cpp,它應該就夠了。