2016-07-26 43 views
1

我在同一個程序中創建了「wor.txt」文件,並關閉了它的寫入流。但是當我嘗試訪問它在第一次運行(我創建該文件)它給出了分段錯誤,但是當我重新運行該程序它運行成功。fgetc()創建分割錯誤

當我刪除自動生成的文件並再次運行程序時,它給出了分段錯誤,並在第二次運行(不刪除文件)它再次成功運行。

注意:有數據的文本文件,因此它不是空(在文件管理器在第一次運行後,我已經看到了)

FILE *fp1= fopen("wor.txt","r"); 

FILE *f1= fopen("wordsa.txt","ab+"); 

if((f1==NULL)||(f2==NULL)){ 
printf("f1 or f2 is null"); 
} 

char c='0'; 
while((c)!=EOF){ 
printf("Here is one marker\n"); 
    c=fgetc(fp1); //This Line gives error 
printf("Here is another marker\n"); 
    fputc(c,f1); 
}  
+2

'f1 == NULL' - >'fp1 == NULL'。如果你的代碼格式正確,你可以自己看看。你也應該使用一致的命名約定:調用變量'f1'和'f2'或'fp1'和'fp2'。 –

+1

在檢測到'fp1 == NULL'後(至少我假設你在你的代碼中檢查'f2')反正你繼續 –

回答

2

一個char沒有足夠EOF,改變類型int

檢查man pagefgetc(),它會返回一個int並且您應該使用相同的數據類型來存儲返回值並進一步使用。

也就是說,當f1fp1之一是NULL,您仍在繼續,訪問那些可能會創建UB的文件指針。你應該對NULL檢查有所瞭解,並且可以使用returnexit,這樣就不會訪問訪問指針的代碼。

0

錯誤的檢查。

要正確檢測流的打開,請檢查fp1而不是f2。然後,當文件不正常打開而不是seg故障時,代碼將優雅地失敗。

FILE *fp1= fopen("wor.txt","r"); 
FILE *f1= fopen("wordsa.txt","ab+"); 

// if((f1==NULL)||(f2==NULL)){ 
if((f1==NULL) || (fp1==NULL)){ 

    printf("f1 or fp1 is null"); 
} 

還可以使用作爲int cfgetc()通常返回256個+ 1不同的值(unsigned char值和EOF)和char是不足以唯一區分它們。