2011-12-27 86 views
1

我使用Visual Studio在C中創建了一個靜態庫。該庫包含一個訪問存儲在當前目錄中的文本文件的函數。圖書館建造得當。但問題是,當我從其他項目外調用函數時,它不會加載該文本文件(我正確鏈接了.lib文件,除了加載該文件外,其他所有工作都正常)。引用C靜態庫中的文件

任何想法如何從.lib文件加載文本文件只是通過相對路徑?

在此先感謝..

以下是庫測試功能定義

int test() 
{ 
    FILE *fp = fopen("hello.txt", "r"); 
    if(!fp) printf("File Error"); 
    return 0; 
} 

的test.lib文件是建立和創造了這一點。 只需訪問當前文件夾hello.txt文件,但從其他項目調用此函數時。它說文件錯誤。

+1

你的代碼實際上是什麼樣的? – bobbymcr 2011-12-27 09:05:50

+0

顯示打開該文本文件的taht函數的代碼以及使用該庫的應用程序 – 2011-12-27 09:10:26

+0

不管您是從lib代碼還是從其他代碼加載文件,都不應該有任何區別。但請確保您知道當前目錄的真實含義! – codeling 2011-12-27 09:20:45

回答

2

修改代碼來看看errno

#include <errno.h> 
#include <string.h> 

... 

    if(!fp) printf("File error: %s\n", strerror(errno)); 

再擡頭看errno的含義您的操作系統,看看發生了什麼事情。

+0

謝謝你,當然,編輯我的迴應。 – 2011-12-27 10:23:17

+1

你是不是指'strerror(errno)'?你也可以用'perror'作爲'if(!fp){perror(「fopen」);/*處理錯誤* /}' – 2011-12-27 11:16:34

+0

duh ... fixed(我沒有看到arg初始化,而且我已經使用C很長時間了)。 – 2011-12-27 11:19:15

0

我很確定你從圖書館調用這個函數的事實是red herring

最可能發生的事情是您的hello.txt文件不在執行過程的working directory中。繼續並在您的項目中輸入#include <windows.h>,然後使用GetCurrentDirectory函數查看運行程序時工作目錄的內容。最有可能的是,它與你的文本文件不一樣。

要解決這個問題,您可以執行以下兩件事之一:您可以更改程序的啓動設置(無論是從Visual Studio還是Windows快捷方式)以指定工作目錄(稱爲「Start in:」 Windows快捷方式)作爲要打開的文本文件的路徑,或者可以確定程序使用的工作目錄,然後將文本文件移動到那裏。

編輯:另外,如果你希望應用程序使用它自己的目錄(其中的可執行文件實際駐留),您可以使用GetModuleFileName函數來獲取可執行文件的完整路徑。當然,你必須在程序產生的字符串末尾修剪程序的文件名,但這應該是小菜一碟。

-2

檢查你的文件路徑並打印一個errno,我認爲你有一個靜態文件路徑

+0

-1。雖然這在技術上是準確的,但它非常簡潔而且沒有信息。 – 2011-12-27 10:32:44