2012-04-23 109 views
0

我想在C++中打開一個文件。打開文件C++錯誤

我的文件位於/home/me/myproject/mydir/myfile.txt

我在該文件存在,並且不爲空,我的文件系統檢查。

我GETCWD(),我在/ home/ME/myproject的是檢查/

因此,我試圖打開它:

string myfilename; 
ifstream myfile; 
myfilename = "./mydir∕myfile.txt"; 
myfile.open(myfilename.c_str(), ios::in); 
if (myfile.fail()) { 
    // I always end up here. 
} 

我真的不明白爲什麼myfile.fail ()總是返回true。任何想法爲什麼它,或者我可以執行什麼調試測試來理解爲什麼它的行爲如此?


我發現有什麼不對,謝謝大家。我使用的遠程控制軟件顯然認爲「/」(正斜槓)不同於「/」(分割字符)。儘管我仍然有一個問題困擾着我,但我會在另一篇文章中提問。 errno和strerror()幫助我理解錯誤。這些錯誤很難找到,對不起,它與C++代碼沒有嚴格的關係。

(注:我在這裏回答,因爲顯然我不能回答我自己的問題)。

+1

嘗試使用絕對路徑'/ home/me/myproject/mydir/myfile.txt'來打開文件。 – Isaac 2012-04-23 11:50:36

+0

我認爲這可行,但一定要檢查您正在運行的進程已讀取該文件的文件系統權限。 http://en.wikipedia.org/wiki/Filesystem_permissions#Traditional_Unix_permissions – HostileFork 2012-04-23 11:52:20

+6

當操作失敗時,打印出'errno'的值,或者['strerror'](http://linux.die.net/man/ 3/strerror)得到一個可讀的字符串。 – 2012-04-23 11:53:11

回答

0

當您使用相對路徑打開文件時,它是從執行目錄計算的,這取決於您如何啓動程序。

假設你的程序位於~/path/to/my/program,如果你當前的目錄是〜當你啓動它時(因此你的命令是./path/to/my/program/my_program),執行目錄是〜。如果您的當前目錄是〜/ path/to/my(並且您使用./program/my_program命令啓動),則執行目錄是〜/ path/to/my。您可以使用getcwd()函數來確定當前的工作目錄。

爲了避免這樣的問題,一個好的經驗法則是在應用程序中始終使用絕對路徑。

此外,您應該在if (myfile.fail()) {...}塊中使用errnostrerror以獲取有關該錯誤的更多信息。

+0

-1,雖然在技術上是正確的:他明確聲明他使用'getcwd()'來檢查路徑。 – KillianDS 2012-04-23 12:32:14

+0

我同意並走得更遠 - 大多數可執行文件和腳本(專門用於處理用戶當前目錄的命令行工具除外)的第一個操作應該是將工作目錄更改爲可執行文件的位置,並且永遠不要使用一個相對路徑。 – Ben 2012-04-23 12:38:16

+0

我對此有一個問題,但我會在另一篇文章中提出。 – bob 2012-04-23 12:58:11