2016-07-26 105 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是不足以唯一区分它们。