Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Xargam en 1 Junio 2018, 18:26 pm



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;

}