2015-11-29 2 views
1

Итак, я пытаюсь прочитать ввод из одного файла (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); 
} 

Однако, когда я изменяю последнее утверждение, если использовать fprintf вместо Printf, я получаю Segmentation Fault: 11. Это последнее, если заявление. Больше ничего не было изменено:

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

Input ride.in в настоящее время выглядит следующим образом:

AAAAAA 
AAAAAA 

Выход ride.out в настоящее время пустой текстовый файл.

+1

Проверка для возвращаемого значения 'fopen' т.е. если' fout' является не 'NULL'. – nnn

+0

У ваших файлов больше 6 байтов? – thumbmunkeys

+0

Возможно, вы превыше границ НЛО и/или группы и развращаете указатель fout. Как выглядит ваш входной файл? – keithmo

ответ

3

Вы читаете строку из 6 символов в массив из 6 символов. Сделайте свои массивы более крупными, чтобы было место для нулевого завершения. Кроме того, «% 6s» будет гораздо более безопасным спецификатором формата для fscanf (иначе вы рискуете переполнением буфера, если входной файл будет искажен).

1
  1. после вызова 1-го fscanf() он читает 6 символов, когда вы вызываете второй fscanf(), он не находит указатель, из которого должен читаться следующий символ. Для этого вам нужно использовать lseek().

здесь код =>

#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() работает нормально ....