Página 1
Índice
Ver este artículo en español 
Página 2
Punteros en C

Leer una cadena de longitud desconocida de un archivo

Alexander Hristov

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

 

 

 

Comentarios

 

Añadir Comentario

Nombre (opcional)
EMail (opcional, no se muestra)

Texto