Terrible problema al trabajar con punteros, estructura, memoria dinam y archivo!

Iniciado por Xargam, 1 Junio 2018, 18:26 PM

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

Xargam

//El problema fue solucionado!!!! ya l oencontre era la variable moves
Hola gente estoy haciendo un codigo que reserva memoria dinamica y guarda la direccion del primer elemento en un puntero a estructura. Luego se abre o genera un archivo. Cargo un dato al puntero y lo escribo en el archivo.  El archivo se genera correctamente pero al cargar el dato al puntero , este se guarda en MAIN pero por alguna razon extraña al entrar a una funcion para gaurdar datos en archivo LOS DATOS DEL PUNTERO SE CONVIERTEN EN BASURA.
Miren les muestro el codigo a ver si alguien descubre el error:


//DECLARACIONES



typedef struct
{

   char title[50];
   int duracion;

} eMovies;



//MAIN

   int quantity = 1;
   int value;
   int moves = 0;
   eMovies* movies;
   movies = newMovie(); // FUNCION 1
   if( movies == NULL)
   {
       printf("ERROR INICIAL");
       system("pause");
       exit(1);
   }
   value = loadMovies(movies,&quantity,"movies.bin"); //FUNCION 2
   if( !value )
   {
       printf("ERROR");
       system("pause");
       exit(1);
   }
   while(moves < quantity)
   {
       printf("El titulo es %d y la duracion es %s\n\n", (movies + moves)->duracion,(movies + moves)->title ); //imprimo la basura de la estructura
       system("pause");
       moves++;
   }


   printf("quantity es %d\n\n",quantity); //MUESTRO LA VARIABLE
   system("pause");
   printf("Ingrese titulo: ");
   scanf("%s", (movies + moves)->title ); //SUSTITUYO LA BASURA POR UN STRING
   setbuf(stdin, NULL);
   printf("\nIngrese duracion: ");
   scanf("%d", &(movies + moves)->duracion ); //SUSTITUYO LA BASURA POR UN INT
   setbuf(stdin, NULL);
   printf("%s", (movies + moves)->title); //EL STRING GUARDAO SE VE CORRECTAMEN
   printf("%p",movies); //LA DIRECCION SE IMPRIME llamenla 0f455f
   printf("Datos cargados en la estructura.\n");
   system("pause");

   saveMovies(movies,"movies.bin"); //FUNCION 3 ERROR ALLI
   free(movies);

   return 0;

------------------------

FUNCION 1

eMovies* newMovie(void)
{
   eMovies* movie;
   movie = malloc(sizeof(eMovies));
   return movie;
}


FUNCION 2


int loadMovies(eMovies* movies, int* quantity , char* filename)
{
   FILE* file;
   eMovies* aux;
   int verify = 1;
   int moves = 0;
   int writed;

   file = fopen(filename,"rb");
   if(file == NULL)
   {
       file = fopen(filename, "wb");
       if(file == NULL )
       {
           verify = 0;
       }
   }
   else
   {
       while( !feof(file) )
       {
           writed = fread(movies + moves,sizeof(eMovies),1,file );
           if(writed != 1)
           {
               if( feof(file) )
               {
                   break;
               }
               else
               {
                   verify = 0;
                   break;
               }
           }

           moves++;
           if( moves >= *quantity )
           {
               aux =(eMovies*) realloc(movies,sizeof(eMovies)*(moves+1) );
               if(aux == NULL)
               {
                   verify = 0;
                   break;
               }
               movies = aux;
               *quantity = moves+1;
           }
       }

   }
   fclose(file);
   return verify;
}

FUNCION 3 LA PROBLEMATICA

int saveMovies(eMovies* movies, char* filename)
{
   int verify = 1;
   int moves = 0;
   int readings;
   FILE* file;
   printf("\nDireccion de memoria de title: %p\n", movies->title);
//LA DIRECCION IMPRESA ES LA MISMA DEL MAIN, ESO ES CORRECTO

   printf("\n %s", movies, (movies)->title );
//SE MUESTRA BASURA... EL DATO CARGADO EN EL MAIN YA NO ESTA OSEA WTF!!!!
   scanf("%s", movies->title );
   printf("\ndir %p, %s", movies, (movies)->title );
//MAS BASURA
   system("pause");
   file = fopen(filename,"wb");
   if(file == NULL)
   {
       verify = 0;
   }
   else
   {
       while( !feof(file) )
       {
           readings = fwrite(movies + moves,sizeof(eMovies),1,file);
//ESCRIBE BASURA Y SE CUELGA EL PROGRAMA.........
           if(readings != 1)
           {
               if( feof(file) )
               {
                   break;
               }
               else
               {
                   verify = 0;
                   break;
               }
           }
           moves++;
       }
   }
   fclose(file);
   return verify;

}