2015-04-13 6 views
0

Я пытаюсь использовать fgets() для чтения текста из файла, и я продолжаю получать ошибку сегментации. Программа читает весь файл, а затем читает последнюю строку, с которой он падает. Любая помощь будет оценена по достоинству.fgets() вызывает ошибку сегментации при чтении файла

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
char *readFile(FILE *); 

char *readFile(FILE *file){ 
    int *outputSize = (int *)malloc(sizeof(int)); 
    (*outputSize) = 1024; 
    char *buf = (char *)malloc(sizeof(char)*1024); 
    char *output = (char *)malloc(sizeof(char)*(*outputSize)); 
    *output='\0'; 
    while(fgets(buf,1024,file)){ 
     if(strlen(output)+strlen(buf)+1>(*outputSize)){ 
      printf("REALLOCATING..."); 
      (*outputSize) *=2; 
      output = realloc(output,sizeof(char)*(*outputSize)); 
     } 
     printf("BUFFER SIZE: %d\nBUFFER : %s\n",strlen(buf),buf); 
     strcat(output,buf); 
     printf("OUTPUT SIZE: %d\nOUTPUT: %s\n",strlen(output),output); 

    } 
    printf("FREEING..."); 
    free(outputSize); 
    free(buf); 
    return output; 
} 
+2

'char * output = (char *) malloc (размерof (char) * (* outputSize)); * выход = 0'; – BLUEPIXY

+1

'if (strlen (output) + strlen (buf) +1> (* outputSize)) {' – BLUEPIXY

+0

Я не вижу, как это поможет. Он делает это через весь файл просто отлично. Но после того, как закончилась ошибка сегментации. – user3294542

ответ

0

Ваш код очень трудно читать, и поэтому очень сложно отлаживать. Вот почему вы просите помочь отладить его.

Вам не нужно читать файл по очереди, когда вы знаете, что читаете весь файл. Упростите этот код и просто прочитайте весь файл, что значительно облегчает устранение неполадок. (Этот код даже имеет все проверки ошибок в менее линий и ИМО является намного легче понять, даже без комментариев или отлаживать заявления, которые говорят вам, что происходит) файлы

char *readFile(FILE *file) 
{ 
    struct stat sb; 
    if (!fstat(fileno(file), &sb)) 
    { 
     return(NULL); 
    } 

    if (-1 == fseek(file, 0, SEEK_SET)) 
    { 
     return(NULL); 
    } 

    char *data = malloc(sb.st_size + 1); 
    if (data == NULL) 
    { 
     return(NULL); 
    } 

    /* this error check might not work in text mode because 
     of \r\n translation */ 
    size_t bytesRead = fread(data, 1, sb.st_size, file); 
    if (bytesRead != sb.st_size) 
    { 
     free(data); 
     return(NULL); 
    } 

    data[ sb.st_size ] = '\0'; 
    return(data); 
} 

заголовка должны быть обновлены.

+2

Если файл открыт в текстовом режиме, sb.st_size' может быть больше, чем 'bytesRead'. 'sb.st_size' представляют собой истинный размер байта файла, тогда как ввод файла может переводить строку, заканчивающуюся как' '\ r \ n" 'to' "\ n" '. – chux

+0

@chux: Да. Я пропустил это. Arrrgh. Я ненавижу этот перевод - это делает невозможным знать, что у вас есть каждый байт. Спасибо, я обновил код, который я разместил. –

Смежные вопросы