簡體   English   中英

fclose()導致分段錯誤

[英]fclose() causes Segmentation Fault

我一直在嘗試使用C語言進行簡單的文件處理,我想確保使用此文件可以訪問該文件

#include<stdio.h>

main()
{
    CheckFile();
}

int CheckFile()
{
    int checkfile=0;

    FILE *fp1;
    fp1 = fopen("users.sav","r");

    if(fp1==NULL)
    {
        fopen("users.sav","w");
        fclose(fp1);
    }   
    if(checkfile!=0)printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);exit(1);
    return 0;
}

然后它顯示

Segmentation fault (core dumped)

但如果文件已經預先存在(例如我手動創建或第二次運行程序時),則不會出現段錯誤

請幫忙。 我需要這個在一周內完成的最終項目,我還沒有掌握文件和指針。

我正在使用“gcc(Ubuntu / Linaro 4.8.1-10ubuntu9)4.8.1”

PS

我知道存在明顯相似的問題,但請不要這樣做。 明白我已經開始編寫了幾個月,因此無法理解這些高級代碼和內容。

PPS

我在另一個問題中看到了這個

在原始代碼中無法保證fopen實際上正在工作,在這種情況下它將返回NULL並且fclose將不會被定義為行為。

那么我該如何檢查它是否有效?

這是正常的,當fp1為NULL時調用fclose(fp1)

BTW

fopen("users.sav","w");

沒用,因為你沒有將返回值賦給文件指針。 這意味着users.sav文件將被打開以進行寫入,但您將永遠無法在其中寫入任何內容。

fopen返回一個FILE指針。 它將返回NULL並設置全局errno以指示錯誤。 如果要檢查errno ,則必須檢查fopen返回NULL

if (fp1 == NULL)
{
    printf("fopen failed, errno = %d\n", errno);
}

否則,你可能會從別的東西得到一個errno ,不一定是你的fopen電話。 還包括errno.h 你也不需要調用fopen("users.sav","w"); 再次。 您不是重新分配指針也不是再次檢查它。

我沒有看到在這里調用fclose的原因,因為如果fopen返回NULL ,則沒有任何東西可以關閉。 這可能是你的seg錯誤的原因。 您正在嘗試關閉空指針。 有關fopen失敗的更多信息

對您的代碼的另一個評論。 如果要從CheckFile返回一個int ,則失敗時它可能不應為0 我會返回-1表示錯誤。 更好的是,您可以返回全局errno 另外, main應該是int main() ,你應該return 0; 在末尾。 我並不特別關心你的CheckFile命名方案。 在C, check_file或駝峰checkFile會更好。

CheckFile ,如果您將多行格式化,則可以格式化一行if語句並使其更正常工作。 它不符合您的想象:

if(checkfile!=0)
{
   printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n", checkfile);
   exit(1);
}

此外, checkfile永遠不會在您的代碼中的任何位置設置..除了零。 所以if語句中的代碼不會執行,句點。

我不確定你要做什么,但是當前的問題是:

if(fp1==NULL)
   fclose(fp1);

斷言fp1為NULL后,您嘗試在空指針上調用close ,這將導致分段錯誤。

如果您只想驗證該文件是否存在,請嘗試以下方法:檢查C中是否存在文件的最佳方法什么? (跨平台)

fclose的手冊說 -

如果stream參數是非法指針,或者已經傳遞給先前調用fclose()的描述符,則fclose()的行為是未定義的。

錯誤發生在代碼中的if塊中。

if(fp1==NULL)
{
    fopen("users.sav","w");
    fclose(fp1);  // passing NULL to fclose invokes undefined behaviour
}   

另一個無關的問題:

這條線可能不是你想要的:

if(checkfile!=0)printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);exit(1);

如果我們正確編寫格式化錯誤變得明顯:

if (checkfile != 0)
  printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);

exit(1);
return 0 ;

實際上即使checkfile為零,我們也會exit(1)

你可能想要這個:

if (checkfile != 0)
{
  printf("\nERROR ACCESSING FILE!\nNow exiting program with exit code: %d\n",checkfile);
  exit(1); 
}

return 0 ;

結論:正確格式化代碼,許多錯誤突然變得明顯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM