回覆列表
  • 1 # 逍遙笙笙

    估計是返回了一個FILE*的空指標,然後這傢伙沒有判斷,直接訪問作業系統的記憶體地址,然後就直接被作業系統給幹掉了(類似Linux系統中的段錯誤)。造成fopen返回NULL的根本原因就是檔案路徑錯誤。好好去檢查一下吧。

  • 2 # 程式設計Cow

    這個需要程式碼才可以具體問題具體分期哈。你沒有發程式碼我只能大概說一下。

    函式原型 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("open fail errno = %d reason = %s \n", errno, strerrno(errno));

    }

    需要指出的是這樣加入printf出問題,那麼分局errno是記錄系統最後一次錯誤程式碼,則有可能得不到我們想要的錯誤碼,反而誤導

    最好的辦法就是

    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 */

    你看一下是否有上面型別,希望可以幫到你。

  • 3 # BWanger軟體開發達人

    fopen讀、寫檔案時,出現應用程式異常錯誤,原因主要有以下幾點:該檔案與其它程序、執行緒共享。

    解決方法:fopen開啟時,必須或”|”一下獨佔屬性EXCLUSIVE

    其它改正即可。

    檔案過大,超出了申請的記憶體空間

    建議先用filelength()函式得到檔案長度,申請空間,fopen讀入。

    以上是出現異常的三個最典型範例。其它錯誤,都不會影響異常退出。

  • 中秋節和大豐收的關聯?
  • 人生過半突然失業,心煩意亂怎麼樣對生活的困境?