我在同一个程序中创建了文件"wor.txt“,并关闭了它的写入流。但是当我第一次尝试访问它(我创建了这个文件)时,它给出了分段错误,但是当我重新运行这个程序时,它运行成功了。
当我删除自动生成的文件并再次运行程序时,它给出了分割错误,在第二次运行时(没有删除文件),它再次成功运行。
注意:文本文件中有数据,因此它不是空的(我在文件管理器中第一次运行后就看到了它)
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);
} 发布于 2016-07-26 19:38:37
char对于EOF是不够的,请将类型更改为int。
检查fgetc()的man page,它返回一个int,您应该使用相同的数据类型来存储返回值,以便进一步使用。
也就是说,当f1或fp1中的任何一个为NULL时,您无论如何都会继续访问这些文件指针,这可能会创建UB。您应该理解NULL检查和return或exit,这样访问tose指针的代码就不会到达。
发布于 2016-07-26 23:06:51
检查不正确。
要正确检测流的打开,请检查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 c,因为fgetc()通常返回256 +1个不同的值(unsigned char值和EOF),并且char不足以唯一地区分它们。
https://stackoverflow.com/questions/38588793
复制相似问题