【问题标题】:fgetc() Creating Segmentation Faultfgetc() 创建分段错误
【发布时间】:2016-07-26 11:34:25
【问题描述】:

我在同一个程序中创建了文件“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);
}       

【问题讨论】:

  • f1==NULL -> fp1==NULL。如果您的代码格式正确,您自己就会看到这一点。此外,您应该使用一致的命名约定:调用两个变量f1f2fp1fp2
  • 在检测到fp1 == NULL 之后(至少我假设在你的代码中你检查f2 代替)你仍然继续

标签: c linux fgetc


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    检查不正确。

    要正确检测流的打开,请检查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 不足以唯一区分它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 2017-03-17
      • 2015-01-08
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      • 2016-06-19
      相关资源
      最近更新 更多