fgets()在读取文件时导致分段错误

时间:2015-04-13 23:30:21

标签: c 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;
}

1 个答案:

答案 0 :(得分:0)

您的代码很难阅读,因此很难调试。这就是为什么你要求帮助调试它。

当您知道自己正在阅读整个文件时,您不需要逐行阅读文件。简化代码并只读取整个文件 - 这使得排除故障变得更加容易。 (这段代码甚至可以在更少的行中进行所有错误检查,即使没有评论或调试语句告诉您正在进行的操作,IMO也更容易理解

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 );
}

标题文件需要更新。