2013-02-07 58 views
0

這是一個很奇怪的錯誤。Fopen返回null,除非在那裏探討?

我使用Visual Studio 2012,並在C++項目(作爲一個C項目的容器),我加載在這樣一個文件:

const char* fname = "SomeFile.csv"; 
if(!(fp = fopen(fname, "r"))) 
{ 
    printf("Error! Could not open %s!\n",fname); 
    return; 
} 

的CSV是在同一個文件夾中.EXE,這就是這個程序的意圖。


1.當我在調試中運行它時,它無法讀取CSV。

2.當我輸入文件的完整路徑名時,它會正常工作並加載CSV。

3.當我轉到Windows資源管理器中的輸出文件夾並運行.exe時,它正確加載了CSV。

4.現在這裏是怪異的部分。當我到另一個文件夾(其他任何地方),然後將包含.exe的完整路徑粘貼到Windows資源管理器中時,它會啓動該程序,但它無法讀取CSV。

作爲一個警告,如果我已經在資源管理器中加載文件夾,但在VS2012調試器中運行它,它也無法加載CSV。

這是怎麼回事?爲什麼只有在瀏覽器中打開窗口時才能找到它?

+2

您需要將VS上的工作目錄設置爲文件所在的文件夾。 – imreal

+0

@Nick在大多數其他語言中,文件打開命令的默認位置是要運行的程序的位置。在C中不是這種情況嗎? – Xantham

+0

這取決於IDE。這方面沒有標準。 – imreal

回答

0

fopenopen等等,將給定一個沒有路徑組件的裸文件名,嘗試打開「當前目錄」中的指定文件。給定一個沒有文件系統根目錄的文件名,它會嘗試打開目錄相對到當前目錄中的文件。只有在給定絕對(完整)路徑的情況下,它纔會完全看到你告訴它的位置。

在基於命令行的系統中,當前目錄非常明顯 - 它是發出命令時所處的目錄。

在圖形用戶界面的當前目錄的概念是有點肉麻:

  • 導航在Windows資源管理器程序(假設WORD.EXE),並雙擊它 - 當前目錄可能是程序所在的目錄 - 您導航到的地方(但沒有標準說明必須如此)
  • 導航到項目的文檔,然後雙擊Word文檔,該文檔啓動WORD.EXE自動 - 當前目錄是什麼?這可能是文檔的位置。
  • 從開始菜單啓動WORD.EXE - 現在的目錄是什麼?
  • 從調試器啓動程序 - 現在什麼是當前目錄?

最後一點就是爲什麼你必須告訴IDE /調試器啓動你的程序時使用什麼作爲當前目錄。

fileOpenDialog不正是「默認」到當前目錄 - 它開到您上次打開一看,不改變當前目錄下的程序 - 當你選擇一個文件,它隨後將完整路徑該文件的到程序。

相關問題