Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: harry_the_blogger en 1 Abril 2016, 20:03 pm



Título: Ayuda con basura en fread
Publicado por: harry_the_blogger en 1 Abril 2016, 20:03 pm
Hola, amigos, estoy haciendo pequeños experimentos, y necesito leer un archivo.

Resulta que el codigo lo que hace es cargar el archivo en una memoria dinamica a traves de un puntero, pero al usar fread capta algo como "COM;<" al final del archivo, cosa que no es verdad.

No sé de donde aparece, pero les dejo el codigo, por si pueden ayudar, gracias.

Código
  1. ///This program receives a list of files in a text file, and glue togheter with a plus:
  2. ///all are compressed. The program can extract one file if the user wants it. The package
  3. ///can not be modified.
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7.  
  8. struct package_header{
  9.    int magic_number; //0xDEADBEFF;
  10.    int number_of_files_stored;
  11. };
  12.  
  13. struct file_entry{
  14.    char file_name[64];
  15.    int file_start;
  16.    int file_size;
  17. };
  18.  
  19. int main(int argc, char *argv[])
  20. {
  21.    if(argc < 2){
  22.        printf("Usage: mesa-pack.exe <list of files to package.txt>\n");
  23.    }
  24.  
  25.    FILE *list_of_files;
  26.    FILE *package;
  27.    int filesize;
  28.    char *content;
  29.    char *token;
  30.  
  31.    list_of_files = fopen(argv[1], "rb");
  32.    if(list_of_files == NULL){
  33.        printf("File list is damaged or computer unexpected error while opening file. Try again.\n");
  34.        return -1;
  35.    }
  36.  
  37.    fseek(list_of_files, 0, SEEK_END);
  38.    filesize = ftell(list_of_files);
  39.    fseek(list_of_files, 0, SEEK_SET);
  40.  
  41.    content = (char *)calloc(filesize, sizeof(char));
  42.  
  43.    //memset(content, 0, filesize);
  44.  
  45.  
  46.    fread((char *) content, filesize, 1, list_of_files);
  47.  
  48.    printf("filesize = %d\n", filesize);
  49.    printf("File content: %s\n", content);
  50.  
  51.    printf("Showing list of files to package...\n\n");
  52.    token = strtok(content, "\n");
  53.    while(token != NULL){
  54.        printf("token = %s\n", token);
  55.        token = strtok(NULL, "\n");
  56.  
  57.    }
  58.  
  59.    free(content);
  60.  
  61.  
  62.    return 0;
  63. }
  64.  
  65.  

http://subefotos.com/ver/?dba9f455a39df69e79173249a0764a0fo.jpg (http://subefotos.com/ver/?dba9f455a39df69e79173249a0764a0fo.jpg)


Título: Re: Ayuda con basura en fread
Publicado por: class_OpenGL en 1 Abril 2016, 20:19 pm
Yo creo que el problema reside en que fread no pone un carácter de fin de cadena al final de la cadena 'content'. Para solucionar esto, primero en la memoria dinámica tendrías que darle un byte más y luego añadir un carácter de fin de cadena (el cual es '\0') para que así el programa sepa el fin de la cadena.


Título: Re: Ayuda con basura en fread
Publicado por: harry_the_blogger en 2 Abril 2016, 14:54 pm
Gracias openGL, probé la solucion y sirvio. Hay veces que eso no pasa, como en otro programa que tengo.


Título: Re: Ayuda con basura en fread
Publicado por: class_OpenGL en 2 Abril 2016, 15:30 pm
No pasa porque por casualidad, justo después de tu cadena (en la memoria) hay un carácter nulo (el que indica fin de cadena). En un ejecutable suelen haber muchos de estos caracteres, por eso no es raro que te haya coincidido :D