fopen出錯(cuò)問(wèn)題
總結(jié):在樹(shù)莓派上 由于權(quán)限的問(wèn)題,導(dǎo)致創(chuàng)建文件失敗。
函數(shù)介紹:
函數(shù)原型 FILE * fopen(const char * path,const char * mode);
函數(shù)功能 打開(kāi)一個(gè)文件
參數(shù): path [in] 名稱 mode[in] 打開(kāi)方式
返回值:文件順利打開(kāi)后,指向該流的文件指針就會(huì)被返回。如果文件打開(kāi)失敗則返回NULL,并把錯(cuò)誤代碼存在errno 中。
注:這里只是簡(jiǎn)單介紹下函數(shù)功能和參數(shù),具體參數(shù)意思此處不分析。
原因分析及方法
1 參數(shù)path問(wèn)題, 路徑不對(duì)fopen就會(huì)是返回失敗。
分析:首先查看path文件是否存在,其次檢查path的路徑相對(duì)路徑還是絕對(duì)路徑?如果是相對(duì)路徑再檢查是否當(dāng)前進(jìn)程的目錄會(huì)切換了,軟件找不到文件了.
如 相對(duì)路徑 FILE *fp = fopen("./test/1.txt", "r");
絕對(duì)路徑 FILE *fp = fopen("/mnt/text/1.txt", "r");
假如確定參數(shù)path沒(méi)問(wèn)題后,則可以排除文件不存在的路徑問(wèn)題。此時(shí)可以打印錯(cuò)誤碼errno來(lái)定位問(wèn)題(這個(gè)后面介紹)。
2 參數(shù)mode問(wèn)題,mode控制文件打開(kāi)的方式,如果用戶打開(kāi)的方式超出了當(dāng)前用戶的權(quán)限,那么fopen也會(huì)返回失敗,
此時(shí)應(yīng)該檢查當(dāng)前用戶的操作權(quán)限,也可以打印錯(cuò)誤碼errno來(lái)定位問(wèn)題
如果當(dāng)前用戶僅僅只有讀的權(quán)限而以讀寫(xiě)的方式打開(kāi)文件 FILE *fp = fopen("./test/1.txt", "W+")
3 檢查程序中是否有句柄泄露的可能即頻繁的調(diào)用fopen而沒(méi)有fclose,這種情況的表象就是前面剛剛開(kāi)始的時(shí)候可以open成功
過(guò)一段時(shí)間后,怎么都o(jì)pen不成功了,檢查路徑和權(quán)限都沒(méi)有問(wèn)題, 那此時(shí)就要檢查下是否句柄泄露了。一般linux最多支持1000來(lái)個(gè)
句柄,打開(kāi)太多不關(guān),則其他的沒(méi)法打開(kāi)了
4 通過(guò)檢查errno來(lái)分析定位問(wèn)題, errno是一個(gè)int型的值,在errno.h中定義不需要自己定義。
可以通過(guò)strerror(errno)查看錯(cuò)誤信息, errno是調(diào)試程序的一個(gè)重要方法。
注:errno 是記錄系統(tǒng)的最后一次錯(cuò)誤代碼。
例如
FILE *fp = NULL;
if ((fp =fopen("./test/1.txt", "r")) == NULL)
{
printf("open fail errno = %d reason = %s \n", errno, strerrno(errno));
}
需要指出的是這樣加入printf出問(wèn)題,那么分局errno是記錄系統(tǒng)最后一次錯(cuò)誤代碼,則有可能得不到我們想要的錯(cuò)誤碼,反而誤導(dǎo)
最好的辦法就是
FILE *fp = NULL;
int errNum = 0;
if ((fp =fopen("./test/1.txt", "r")) == NULL)
{
errNum = errno;
printf("open fail errno = %d reason = %s \n", errNum, strerrno(errNum));
}
常見(jiàn)的errno錯(cuò)誤碼有以下這些:
#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 */
————————————————
WX:jerrycarm 加個(gè)好友一起來(lái)玩嵌入式啊。
版權(quán)聲明:本文為CSDN博主「再鬧東海7」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_31186123/article/details/81172890
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。