Título: Terrible problema al trabajar con punteros, estructura, memoria dinam y archivo! Publicado por: Xargam en 1 Junio 2018, 18:26 pm //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; } |