我制作了文件" 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);
}
答案 0 :(得分:2)
char
EOF
不足以将类型更改为int
。
检查fgetc()
的{{3}},它会返回int
,您应该使用相同的数据类型来存储返回值并进一步使用。
也就是说,当f1
或fp1
中的任何一个NULL
时,您仍然会继续访问那些可能会创建UB的文件指针。您应该了解一下NULL检查以及return
或exit
,以便无法访问访问指针的代码。
答案 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 c
,fgetc()
通常会返回256 + 1个不同的值(unsigned char
值和EOF
),而char
不足以唯一区分它们