色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > fopen出錯問題

          fopen出錯問題

          發(fā)布人:電子禪石 時間:2021-06-28 來源:工程師 發(fā)布文章

          總結:在樹莓派上 由于權限的問題,導致創(chuàng)建文件失敗。

          函數(shù)介紹:

          函數(shù)原型 FILE * fopen(const char * path,const char * mode); 

          函數(shù)功能 打開一個文件

          參數(shù):   path [in] 名稱   mode[in] 打開方式

          返回值:文件順利打開后,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,并把錯誤代碼存在errno 中。 

          注:這里只是簡單介紹下函數(shù)功能和參數(shù),具體參數(shù)意思此處不分析。


          原因分析及方法

          1 參數(shù)path問題, 路徑不對fopen就會是返回失敗。

          分析:首先查看path文件是否存在,其次檢查path的路徑相對路徑還是絕對路徑?如果是相對路徑再檢查是否當前進程的目錄會切換了,軟件找不到文件了.

          如 相對路徑 FILE *fp = fopen("./test/1.txt", "r"); 

            絕對路徑 FILE *fp = fopen("/mnt/text/1.txt", "r");

          假如確定參數(shù)path沒問題后,則可以排除文件不存在的路徑問題。此時可以打印錯誤碼errno來定位問題(這個后面介紹)。


          2 參數(shù)mode問題,mode控制文件打開的方式,如果用戶打開的方式超出了當前用戶的權限,那么fopen也會返回失敗,

          此時應該檢查當前用戶的操作權限,也可以打印錯誤碼errno來定位問題

          如果當前用戶僅僅只有讀的權限而以讀寫的方式打開文件 FILE *fp = fopen("./test/1.txt", "W+")


          3 檢查程序中是否有句柄泄露的可能即頻繁的調(diào)用fopen而沒有fclose,這種情況的表象就是前面剛剛開始的時候可以open成功

          過一段時間后,怎么都open不成功了,檢查路徑和權限都沒有問題, 那此時就要檢查下是否句柄泄露了。一般linux最多支持1000來個

          句柄,打開太多不關,則其他的沒法打開了


          4 通過檢查errno來分析定位問題, errno是一個int型的值,在errno.h中定義不需要自己定義。

          可以通過strerror(errno)查看錯誤信息, errno是調(diào)試程序的一個重要方法。


          注:errno 是記錄系統(tǒng)的最后一次錯誤代碼。


          例如 

          FILE *fp = NULL;

          if ((fp =fopen("./test/1.txt", "r")) == NULL)

          {

          printf("open fail errno = %d reason = %s \n", errno, strerrno(errno));

          需要指出的是這樣加入printf出問題,那么分局errno是記錄系統(tǒng)最后一次錯誤代碼,則有可能得不到我們想要的錯誤碼,反而誤導

          最好的辦法就是

          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));


          常見的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 */

          ————————————————

          WX:jerrycarm  加個好友一起來玩嵌入式啊。

          版權聲明:本文為CSDN博主「再鬧東海7」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

          原文鏈接:https://blog.csdn.net/qq_31186123/article/details/81172890


          *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。



          關鍵詞: C

          相關推薦

          技術專區(qū)

          關閉