函式原型 file * fopen(const char * path,const char * mode);
函式功能 開啟乙個檔案
引數: path [in] 名稱 mode[in] 開啟方式
返回值:檔案順利開啟後,指向該流的檔案指標就會被返回。如果檔案開啟失敗則返回null,並把錯誤**存在errno 中。
注:這裡只是簡單介紹下函式功能和引數,具體引數意思此處不分析。
1 引數path問題, 路徑不對fopen就會是返回失敗。
分析:首先檢視path檔案是否存在,其次檢查path的路徑相對路徑還是絕對路徑?如果是相對路徑再檢查是否當前程序的目錄會切換了,軟體找不到檔案了.
如 相對路徑 file *fp = fopen("./test/1.txt", "r");
絕對路徑 file *fp = fopen("/mnt/text/1.txt", "r");
假如確定引數path沒問題後,則可以排除檔案不存在的路徑問題。此時可以列印錯誤碼errno來定位問題(這個後面介紹)。
2 引數mode問題,mode控制檔案開啟的方式,如果使用者開啟的方式超出了當前使用者的許可權,那麼fopen也會返回失敗,
此時應該檢查當前使用者的操作許可權,也可以列印錯誤碼errno來定位問題
如果當前使用者僅僅只有讀的許可權而以讀寫的方式開啟檔案 file *fp = fopen("./test/1.txt", "w+")
3 檢查程式中是否有控制代碼洩露的可能即頻繁的呼叫fopen而沒有fclose,這種情況的表象就是前面剛剛開始的時候可以open成功
過一段時間後,怎麼都open不成功了,檢查路徑和許可權都沒有問題, 那此時就要檢查下是否控制代碼洩露了。一般linux最多支援1000來個
控制代碼,開啟太多不關,則其他的沒法開啟了
4 通過檢查errno來分析定位問題, errno是乙個int型的值,在errno.h中定義不需要自己定義。
可以通過strerror(errno)檢視錯誤資訊, errno是除錯程式的乙個重要方法。
注:errno 是記錄系統的最後一次錯誤**。
例如 file *fp = null;
if ((fp =fopen("./test/1.txt", "r")) == null)
需要指出的是這樣加入printf出問題,那麼分局errno是記錄系統最後一次錯誤**,則有可能得不到我們想要的錯誤碼,反而誤導
最好的辦法就是
file *fp = null;
int errnum = 0;
if ((fp =fopen("./test/1.txt", "r")) == null)
常見的errno錯誤碼有以下這些:
#define eperm 1 /* operation not permitted */
#define enoent 2 /* no such file or directory */
#define esrch 3 /* no such process */
#define eio 5 /* i/o error */
#define enxio 6 /* no such device or address */
#define e2big 7 /* argument list too long */
#define enoexec 8 /* exec format error */
#define ebadf 9 /* bad file number */
#define echild 10 /* no child processes */
解決 記憶體出錯問題
tianweishuiguo的回答 char a this is 這個在常量區分配乙個空間,然後a指向此空間 char a this is 這個在常量區分配乙個空間,然後又在棧上分配乙個空間,將常量區的內容複製過來,所以可以修改 解決方法 strcat t,p 這樣寫是不對的,t是字元型變數,而st...
cvReleaseImage 出錯的問題
在寫相關程式的時候,在程式的結尾處釋放前段自定義的變數。使用函式cvreleaseimage src img 時程式在除錯結束後報錯,指明是在釋放記憶體時出錯。經過看前輩們遇到的相同的問題。先總結如下 cvreleaseimage 和cvcreateimage 相對應的。在程式中如果沒有使用cvcr...
import caffe 出錯的問題
import caffe 時如果提示 找不到或者沒有此模組時 多半是沒有安裝或者是環境變靈沒有配置 以下是make之後import caffe仍報錯的一些處理 在命令列輸入 python 再輸入import caffe時,可能會報以下錯誤 can not find module skimage.io...