Ayuda con basura en fread

Iniciado por harry_the_blogger, 1 Abril 2016, 20:03 PM

0 Miembros y 1 Visitante están viendo este tema.

harry_the_blogger

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.


///This program receives a list of files in a text file, and glue togheter with a plus:
///all are compressed. The program can extract one file if the user wants it. The package
///can not be modified.

#include <stdio.h>
#include <stdlib.h>

struct package_header{
   int magic_number; //0xDEADBEFF;
   int number_of_files_stored;
};

struct file_entry{
   char file_name[64];
   int file_start;
   int file_size;
};

int main(int argc, char *argv[])
{
   if(argc < 2){
       printf("Usage: mesa-pack.exe <list of files to package.txt>\n");
   }

   FILE *list_of_files;
   FILE *package;
   int filesize;
   char *content;
   char *token;

   list_of_files = fopen(argv[1], "rb");
   if(list_of_files == NULL){
       printf("File list is damaged or computer unexpected error while opening file. Try again.\n");
       return -1;
   }

   fseek(list_of_files, 0, SEEK_END);
   filesize = ftell(list_of_files);
   fseek(list_of_files, 0, SEEK_SET);

   content = (char *)calloc(filesize, sizeof(char));

   //memset(content, 0, filesize);


   fread((char *) content, filesize, 1, list_of_files);

   printf("filesize = %d\n", filesize);
   printf("File content: %s\n", content);

   printf("Showing list of files to package...\n\n");
   token = strtok(content, "\n");
   while(token != NULL){
       printf("token = %s\n", token);
       token = strtok(NULL, "\n");

   }

   free(content);


   return 0;
}



http://subefotos.com/ver/?dba9f455a39df69e79173249a0764a0fo.jpg
Vista mi blog es enriquemesa.blogspot.com

class_OpenGL

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.

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

harry_the_blogger

Gracias openGL, probé la solucion y sirvio. Hay veces que eso no pasa, como en otro programa que tengo.
Vista mi blog es enriquemesa.blogspot.com

class_OpenGL

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

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL