[ Foro de C ]

Problema al leer archivo en c

30-Apr-2020 04:38
Invitado (Julian)
1 Respuestas

Hola, estoy leyendo un archivo en bloques de 32 bytes. La primer linea me la lee, y la puedo depurar, pero luego el programa se me cuelga. Lo debugee pero sigo sin encontrar el error. Adjunto código. Si alguien puede darme una mano genial, muchas gracias!


#include "file_manage.h"

char* file_read_line(FILE *fp){
    char buffer[32];
    fread(buffer, 1, sizeof(buffer), fp);
    char *full_line = (char*) malloc(32);
    memcpy(full_line, buffer, strlen(buffer)+1);
    int n = 2;
    while (strchr(full_line, '\n') == NULL){
        memset(buffer, 0, sizeof(buffer));
        full_line = realloc(full_line, n*32);
        fread(buffer, 1, sizeof(buffer), fp);
        memcpy(&full_line[(n-1)*32], buffer, sizeof(buffer));
        n++;
    }
    fclose(fp);
    return full_line;
}

char* file_clean_line(char *file_line){
    int i = 0;
    char *clean_line = (char *) malloc(1);
    while (file_line[i] != '\n'){
        clean_line = realloc(clean_line, sizeof(char)*(i+1));
        clean_line[i] = file_line[i];
        i++;
    }
    free(file_line);
    return clean_line;
}


int main(int argc, char const *argv[]){
    FILE *fp;
    fp = fopen(argv[1], "r");
    int bytes_clean_read = 0;
    while (!feof(fp)){
        char *read_line = file_read_line(fp);
        char *clean_line = file_clean_line(read_line);
        for (int i = 0; i < strlen(clean_line); i++){
            printf("%c",clean_line[i]);
        }
        bytes_clean_read += strlen(clean_line);
        printf("\n");
        printf("%li\n", strlen(clean_line));
        memset(read_line, 0, strlen(read_line));
        memset(clean_line, 0, strlen(clean_line));
        free(clean_line);
        fseek(fp, bytes_clean_read+1, SEEK_SET);
    }
    return 0;
}


 


30-Apr-2020 10:35
Nacho Cabanes (+83)

En mi opinión, lo que estás haciendo es interesante pero peligroso. Si el fichero es de texto, no uses bloques de tamaño fijo, o al menos no busques saltos de línea. Eso dejado para ficheros binarios, en los que simplemente compruebas el EOF (fin de fichero). En texto, lee byte a byte (o a una cadena suficientemente grande) y evitarás problemas...






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)