首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fgetc()创建分段错误

fgetc()创建分段错误
EN

Stack Overflow用户
提问于 2016-07-26 19:34:25
回答 2查看 3.2K关注 0票数 1

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

当我删除自动生成的文件并再次运行程序时,它给出了分割错误,在第二次运行时(没有删除文件),它再次成功运行。

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

代码语言:javascript
复制
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);
}       
EN

回答 2

Stack Overflow用户

发布于 2016-07-26 19:38:37

char对于EOF是不够的,请将类型更改为int

检查fgetc()man page,它返回一个int,您应该使用相同的数据类型来存储返回值,以便进一步使用。

也就是说,当f1fp1中的任何一个为NULL时,您无论如何都会继续访问这些文件指针,这可能会创建UB。您应该理解NULL检查和returnexit,这样访问tose指针的代码就不会到达。

票数 2
EN

Stack Overflow用户

发布于 2016-07-26 23:06:51

检查不正确。

要正确检测流的打开,请检查fp1,而不是f2。然后,当文件不能正确打开时,代码将优雅地失败,而不是seg错误。

代码语言:javascript
复制
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不足以唯一地区分它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38588793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档