fgetc()创建分段错误

时间:2016-07-26 11:34:25

标签: c linux fgetc

我制作了文件" wor.txt"在同一个程序中,我关闭了它的写入流。但是当我尝试在第一次运行时访问它(我创建了文件)时,它会给出分段错误,但是当我重新运行该程序时它会成功运行。

当我删除自动生成的文件并再次运行程序时,它会出现Segmentation fault并在第二次运行时(不删除文件)再次成功运行。

注意:文本文件中有数据因此它不是空的(我在文件管理器中第一次运行后看到它)

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 个答案:

答案 0 :(得分:2)

char EOF不足以将类型更改为int

检查fgetc()的{​​{3}},它会返回int,您应该使用相同的数据类型来存储返回值并进一步使用。

也就是说,当f1fp1中的任何一个NULL时,您仍然会继续访问那些可能会创建UB的文件指针。您应该了解一下NULL检查以及returnexit,以便无法访问访问指针的代码。

答案 1 :(得分:0)

检查不正确。

要正确检测流的开放,请检查fp1,而不是f2。当文件未正确打开而不是seg fault时,代码将正常失败。

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不足以唯一区分它们