Esta pequeña función permite leer de un archivo una línea de longitud ilimitada (bueno, solo limitada por la memoria disponible) y desconocida de antemano. Protege contra desbordamientos de buffer y evita hacer demasiados reallocs.
/** * Lee una línea de longitud arbitraria de un archivo. Devuelve NULL si en * algún momento se detecta que no hay memoria suficiente en el sistema para * leer la línea completa, o si ocurre algún error de entrada/salida durante * la lectura. * * Precondiciones : *file != NULL * Postcondiciones : * si se consigue leer una línea completa, result != NULL && strchr(result,'\n') == NULL * si no hay memoria suficiente, result == NULL * si se produce un error de E/S, result == NULL * * */ char* leerLinea(FILE *file) { const int LONGITUD_BLOQUE = 80; char* cadena = (char*)calloc(LONGITUD_BLOQUE,sizeof(char)); if (!cadena || !fgets(cadena,LONGITUD_BLOQUE,file)) { free(cadena); return NULL; } int longitudActual = 0; while(1) { char* saltoLinea = strchr(cadena+longitudActual,'\n'); if (saltoLinea != NULL) { *saltoLinea = '\0'; return cadena; } if (feof(file)) { return cadena; } longitudActual += LONGITUD_BLOQUE-1; char* nuevaUbicacion = (char*)realloc(cadena,longitudActual+LONGITUD_BLOQUE); if (!nuevaUbicacion) { // oops - nos hemos quedado sin memoria free(cadena); return NULL; } cadena = nuevaUbicacion; if (!fgets(cadena+longitudActual,LONGITUD_BLOQUE,file)) { free(cadena); return NULL; } } }