Estudio de getline
Probando getline y la maldicion del fin de linea.
/** * probando getline * Cual es la forma optima de leer un fichero linea por linea? * quiza getline es mejor que gets, sobre todo para casos en los que * cada linea pueda ser muy larga. * La variable linea es un puntero. * Guardamos espacio con malloc y por si hay sorpresas el manual de glibc * nos dice que con getline se okupara mas memoria de forma automatica */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main (int argc, char *argv[]) { FILE* fichero; //char linea[512]; char *linea; int *total; printf("Hola, has puesto: %s %s ", argv[0], argv[1]); if ( (fichero = fopen(argv[1],"r")) == NULL ) { perror("Error al abrir fichero"); exit(EXIT_FAILURE); } else { printf("Ok, fichero abierto. "); } linea = ((char *)malloc(512)); while ((!feof(fichero)) && (getline(&linea, &total, fichero) != -1)) { // le quitamos caracter de salto de linea linea[strlen(linea)-1] = ' '; printf("%s> %s [tam: %d] ",argv[1], linea, strlen(linea)); } close(fichero); exit(EXIT_SUCCESS); }Esta podria ser otra version de iteracion, mas rapida pero que con ficheros vacios "leera" una linea.
/** * probando getline - version do-while * Cual es la forma optima de leer un fichero linea por linea? * quiza getline es mejor que gets, sobre todo para casos en los que * cada linea pueda ser muy larga. * La variable linea es un puntero. * Guardamos espacio con malloc y por si hay sorpresas el manual de glibc * nos dice que con getline se okupara mas memoria de forma automatica */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main (int argc, char *argv[]) { FILE* fichero; //char linea[512]; char *linea; int *total; printf("Hola, has puesto: %s %s ", argv[0], argv[1]); if ( (fichero = fopen(argv[1],"r")) == NULL ) { perror("Error al abrir fichero"); exit(EXIT_FAILURE); } else { printf("Ok, fichero abierto. "); } linea = ((char *)malloc(512)); do { getline(&linea, &total, fichero); // le quitamos caracter de salto de linea linea[strlen(linea)-1] = ' '; printf("%s> %s [tam: %d] ",argv[1], linea, strlen(linea)); } while (!feof(fichero)); close(fichero); exit(EXIT_SUCCESS); }