2016-10-01 73 views
-1

我正在嘗試從文件讀取。它似乎要(至少)相對路徑。我看到的大多數教程只使用一個文件名。從文件讀取時,參數必須是完整路徑?

我有src dir和build dir在一個目錄中。當我傳遞一個相對路徑時,它可以工作。但是,如果我嘗試在Docker容器內運行此代碼,現在我的代碼將無法工作,除非我給它一個絕對路徑。

我做錯了什麼?讀取文件不會很困難。

這裏是我的代碼:

std::string line; 
    std::vector<std::string> thingsToDo; 
    std::ifstream myfile(filename); 
    if (myfile.is_open()) { 
     while (getline(myfile, line)) { 
      thingsToDo.push_back(line); 
     } 
     myfile.close(); 
    } 
    else { 
     std::cout << "Unable to open file" << std::endl; 
    } 

其中 「filename」 是...

std::string filename = "things.txt" << works in tutorials, but not in real life :\ 
std::string filename = "../src/things.txt" << works on my machine :) (because remember, we are running the code from 'build' dir) 
std::string filename = "/tmp/abolute/path/things.txt" << works in Docker :\ 

幫助...

+4

如果相對路徑沒有不同的環境中工作,那麼出發點發生了變化。檢查當前的工作目錄。 –

+2

如果您從IDE運行程序,工作目錄可能不是您所期望的。如果從命令行運行,工作目錄就是您當前所在的目錄。大多數IDE都有可以爲項目設置固定工作目錄的選項,並且可以從命令行將cd切換到正確的目錄。但重點在於,程序中的當前工作目錄可能是意想不到的,並且相對路徑(例如,甚至是「../」路徑)可能會在沒有通知的情況下失敗。絕對路徑永遠不會失敗(除非路徑當然不存在)。 –

+0

你們是怎麼做到的?就像,我從命令行運行這個程序。所以我們說我正在'建立'。我去./myProgram。現在我運行Docker。現在我調用我的程序,如/ tmp/abolute/path/src/myProgram。程序認爲該文件現在在哪裏?你懂? – Bear

回答

0

解決。最簡單的事情:將文件複製到內部。然後你所要做的就是傳遞文件名。

如何:

CMakeLists:

configure_file (
    "${PROJECT_SOURCE_DIR}/things.txt" 
    "${PROJECT_BINARY_DIR}/things.txt" 
)