Lee texto de un archivo y realloc cuando sea necesario

Quiero leer el texto de un archivo de texto línea por línea y hacer un procesamiento en estas líneas. Puedo hacer todo el procesamiento, pero no puedo hacer crecer la memoria con malloc-realloc. Primero le di memoria limitada, si los caracteres de las líneas de mi archivo de texto están en este límite, todo está bien. Si uso archivos grandes como 10,000 caracteres por línea, solo se leerá hasta mi límite. No entiendo exactamente cómo usar realloc() . ¿Qué puedo hacer con este código?

  void stat(char* fileptr) { FILE *fp; char *linebuffer; int line=0; int sum=0; int max=0; int min=0; int maxlinelen=512; int i=0,j=0; int maxlen=512; int curlinelen[maxlen]; linebuffer=(char*) malloc(maxlinelen * sizeof(char)); if(linebuffer==NULL) { printf("Error occurred allocating memory for linebuffer"); exit(1); } if((fp=fopen(fileptr,"r"))!=NULL) { while((fgets(linebuffer,maxlinelen,fp))!=NULL) { if(strlen(linebuffer)==maxlinelen) { maxlinelen*=2; linebuffer=realloc(linebuffer,maxlinelen * sizeof(char)); if(linebuffer==NULL) { printf("Error occurred reallocating space for linebuffer"); exit(1); } } line++; sum=sum+strlen(linebuffer); curlinelen[i]=strlen(linebuffer); i++; } } min=curlinelen[0]; max=curlinelen[0]; for(j=0;j<line;j++) { if(curlinelen[j]max) { max=curlinelen[j]; } } printf("No. of lines =%d\n",line); printf("Maximum line length =%d\n",max); printf("Minimum line length =%d\n",min); printf("Average line length =%8.2f\n",(float)sum/(float)line); fclose(fp); } 

 fgets(linebuffer,maxlinelen,fp) 

lee y almacena a lo sumo maxlinelen - 1 caracteres en linebuffer y 0-termina. Así

 if(strlen(linebuffer)==maxlinelen) 

nunca está satisfecho, strlen(linebuffer) puede estar a lo sumo maxlinelen - 1 . Cambie la condición y verá que maxlinelen aumenta si el archivo contiene líneas largas (a menos que realloc falle).

Sin embargo, su código actual contará la línea parcial leída como una línea completa y luego leerá la siguiente parte de la línea como una nueva línea. Para hacer crecer el búfer hasta que toda la línea se ajuste, debe continuar leyendo el archivo antes de recostackr la longitud de la línea e incrementar el recuento de líneas. Pero debemos verificar si se leyó una línea completa (incluida la nueva línea al final) en caso de que fgets lea el número máximo permitido de caracteres antes de ampliar el búfer, o concatenaremos la siguiente línea y contaremos dos (o en casos anormales aún más) líneas como una.

 while((fgets(linebuffer,maxlinelen,fp))!=NULL) { while((strlen(linebuffer) == maxlinelen-1) && (linebuffer[maxlinelen-2] != '\n')) { maxlinelen*=2; linebuffer=realloc(linebuffer,maxlinelen * sizeof(char)); if(linebuffer==NULL) { printf("Error occurred reallocating space for linebuffer"); exit(1); } fgets(linebuffer + (maxlinelen/2 - 1), maxlinelen/2 + 1, fp); } 

sería una manera (bastante ineficiente, debido a las llamadas de strlen ) a hacer eso.