仅针对一个文件的分段错误?

时间:2015-11-29 17:10:17

标签: c file io segmentation-fault

所以我试图从一个文件(ride.in)中读取输入,用它进行计算,然后将结果打印到另一个文件(ride.out)中。当我尝试使用fscanf的第一个文件时,它工作正常。当我使用printf进行打印时,它也有效。但是,当我尝试使用fprintf写入文件时,它无法工作,导致分段错误:11。这怎么可能?

有效的代码:

#include <stdio.h>
#include <stdlib.h>
int main () {
FILE *fin  = fopen ("ride.in", "r");
FILE *fout = fopen ("ride.out", "w");

char UFO[6], group[6];

fscanf(fin, "%s", UFO);
int sumUFO = 0, sumGroup = 0;

for(int i = 0; i < 6; i++){
    sumUFO += (int) UFO[i];
}

fscanf(fin, "%s", group);

for(int i = 0; i < 6; i++){
    sumGroup += (int) group[i];
}

fclose(fin);

if(sumUFO == sumGroup)
    printf("GO");
else
    printf("STAY");

exit (0);
}

但是,当我将最后一个if语句更改为使用fprintf而不是printf时,我得到一个Segmentation Fault:11。这是最后一个if语句。没有其他任何改变:

if(sumUFO == sumGroup)
    fprintf(fout,"GO");
else
    fprintf(fout,"STAY");

输入ride.in目前看起来像:

AAAAAA
AAAAAA

输出ride.out目前是一个空文本文件。

2 个答案:

答案 0 :(得分:3)

您正在将6个字符的字符串读入6个字符的数组中。使您的数组更大,以便终止null。此外,对于fscanf,“%6s”将是一个更安全的格式说明符(否则,如果输入文件格式错误,则存在缓冲区溢出的风险)。

答案 1 :(得分:1)

  1. 在调用1st fscanf()之后,当你调用第二个fscanf()时它正在读取6个字符,它没有找到下一个字符必须读取的指针。 因为你必须使用lseek()。
  2. 这里是代码=&gt;

    #include <stdio.h>
    #include <stdlib.h>
    int main () {
    FILE *fin  = fopen ("ride.in", "r");
    FILE *fout = fopen ("ride.out", "w");
    int i;
    char UFO[6], group[6];
    
    fscanf(fin, "%s", UFO);
    int sumUFO = 0, sumGroup = 0;
    
    for(i = 0; i < 6; i++){
     sumUFO += (int) UFO[i];
     printf("%c => %d \n",UFO[i],sumUFO );
    }
    fseek(fin,6,SEEK_SET);
    
    fscanf(fin, "%s", group);
    for(i = 0; i < 6; i++){
     sumGroup += (int) group[i];
     printf("%c =>> %d \n",group[i],sumGroup );
    
    }
    
    fclose(fin);
    
    if(sumUFO == sumGroup)
     fprintf(fout,"GO");
    else
     fprintf(fout,"STAY");
    
    return 0;
    }
    

    在这段代码中fprintf()工作正常....