Page 1
Index
Ver este artículo en español 
Page 2
Punteros en C

Sorry, this page is not available in English. Displaying version for locale : es

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

 

 

 

Comments

 

Add a Comment

Name (optional)
EMail (optional, will not be displayed)

Text