[英]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.