VS2010下出現的Expression:(stream!=Null)問題

昨天在VS2010下寫一些C++的實驗小程序,一開始調試運行都沒什麼問題,但是在寫完另外的一個函數之後就出現問題,程序在調試的時候沒有什麼問題,但是運行就會報下面的錯誤:

Debug assertion failed.

Program:xxxxxxxxx

Line xxx

Expression:(stream!=NULL)

一開始我以爲是我剛加的那個函數有問題,註釋之後發現問題依然存在,到網上查找了很多的資料,但是依然沒有解決,浪費了不少時間,後面發現是一個很簡單的問題,其實可能也不算是個問題。

原來是我第一個函數要用到的一個文件被我用其他的軟件打開了,程序在這個路徑下打不開所需要的文件,然後系統就會報錯,在我關閉其他的軟件,解除對該文件的佔用之後,整個程序運行起來就沒什麼問題了。

雖然是個小問題,不知道的情況下還是不知所措的,所以就寫下這篇博客,總結一下自己的錯誤,再把網上找到的一些類似問題也在這裏說明一下。

首先發生這類錯誤大多是文件處理問題,Expression:(stream!=NULL)是告訴你你傳入的參數是NULL。可能出現錯誤的地點就是在文件處理函數上面,像fopen(),fread(),fprintf()等地方。這個時候就應該去看看你打開文件流爲什麼失敗,最好在fopen(),fread(),fprintf()等函數後面都加上檢錯處理,這樣出現問題之後方便定位。

出現這個問題時,你可以將需要用到的文件放到你要直接執行的exe文件所在的文件夾裏面試試。在VS2010裏面點運行的時候程序運行的當前目錄好像一般是在你源碼所在的位置。這個位置和你exe文件所在目錄是不一樣的,exe文件所在的目錄一般在工程文件裏面的Debug或者Release文件夾下面,所以你在運行程序時,一定要確定你所用到文件沒有被佔用和文件位置在源碼所在的路徑行下(在VS2010下適用,其他工具未作實驗)。

另一種方法是在源碼中適用絕對路徑。就是包含盤符的完整路徑,但這不是個好辦法,就是在更換文件的時候需要在源碼中修改,這會很麻煩,工程脫離了你的運行環境就沒用了。

最完美的解決方法是使用程序的命令行傳入參數,但這個一般來說比較麻煩。但是如果是在windows裏的話,有一個比較簡單的方法。那就是將文件拖到exe文件上,然後這個exe就會以那個文件爲參數執行。

以上的這些前提是程序使用的文件流沒有被佔用,否則打開文件時還會出現問題。


下面再說一點:

VS2010運行的路徑並不是exe文件所在的路徑,而是源碼所在的文件夾下,程序運行所需要的文件都要拷貝到這個目錄下,這樣程序運行的時候就會自動找到所需要的文件作爲參數。這應該算是VS(VC)的Bug,可是微軟方面一直沒有修改,雖然那樣會很麻煩,但是和直接運行的效果一致。雖然Debug和Release調試的效果是一樣的,但是和直接運行的效果就不同了。其實這樣也不能算是一個Bug,微軟可能考慮的是希望Debug和Release的運行路徑應該一致吧,這隻有微軟自己知道了。


想要添加運行參數在VC6和VS20XX是不一樣的

VC6:

工程、設置、Debug、工作目錄。

VS20XX:

項目、屬性、配置屬性、調試、工作目錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章