2016-10-22 178 views
-1

我很慚愧,因爲無法解決這個問題,但我無法完成這項工作。我有這個簡短的測試:ifstream無法找到文件

std::string archnom = "../data/uniform.txt"; 
ifstream archin(archnom.c_str()); 
ASSERT(archin.good()); 

斷言是拋出錯誤。由於某種原因,它沒有找到uniform.txt文件。該項目的結構:

​​

我已經試圖改變archnom沒有成功如下:

std::string archnom = "/data/uniform.txt"; 
std::string archnom = "./data/uniform.txt"; 
std::string archnom = "../data/uniform.txt"; 
std::string archnom = "data/uniform.txt"; 

什麼這裏的問題是什麼?

+0

不要緊,你的程序文件。當你執行它時,當前的工作目錄是什麼? – melpomene

+0

問題是你需要確定什麼是你的進程的當前目錄。與所有當代流行的點對點GUI IDE相比,這是利用cc/gcc的shell提示來學習破解C++的「老派」的優勢之一:無論如何,您絕對不會有任何疑問,並且你永遠不會對你當前的目錄是什麼以及所有文件的位置感到困惑。 –

+0

@melpomene它是項目的根源。我剛剛編輯過 –

回答

2

在終端中,您可以鍵入./build/a.out以啓動a.out程序,並將./作爲當前工作目錄。

當您這樣做時,程序中使用的相對路徑是相對於./ dir - 而不是包含該程序的路徑。

例如,如果我想開ex.txt運行./build/a.out時(和ex.txt是在同一個目錄中建立),我的程序應該有相對路徑./ex.txt - ../ex.txt

+0

我不認爲我完全理解你想說什麼......你能詳細說明一點嗎? –

1
std::string archnom = "../data/uniform.txt"; 

告訴那uniform.txt可以回到一個目錄,然後成數據找到該程序。

但是程序在什麼目錄下查找?好問題。該位置稱爲工作目錄,不幸的是它移動。通常,工作目錄從程序運行的目錄開始,而不是程序的位置。爲了增加興奮感,您的程序可以在運行時更改工作目錄。

所以,如果你的程序是/首頁/鮑勃/代碼和uniform.txt文件是/首頁/鮑勃/數據和你/首頁/鮑勃/代碼運行程序./程序一切都很好。工作目錄是/首頁/鮑勃/代碼和程序返回一個文件夾,然後成數據

如果你在/首頁/鮑勃/工作區你跑../code/program。工作目錄是/home/bob/workspace並且程序返回一個文件夾並且進入數據

但是如果你運行程序//home/bob/code/program?工作目錄是/。你不能真的回到任何地方,你能嗎?

讓我們嘗試一個不太極端的情況:/etc。程序返回到/並轉發給...老鼠。沒有數據目錄。

如果uniform.txt文件總是在同一個地方,並且這個地方是有保證的,那麼請使用固定的路徑。如果uniform.txt將在程序的安裝目錄附近,程序需要知道它在哪裏,並且that takes OS specific code

1

您需要確保當前工作目錄是您期望的目錄。你可以通過使用_chdir(win32)或chdir(gcc)以及使用argv [0](其中包含當前正在運行的可執行文件的路徑)來完成。

我展示瞭如何做到這一點在我的答案在這裏的另一個問題:

Change the current working directory in C++