Estás en: Inicio >> Foros >> Informática >> Programación
Programación /

ayuda con registros, archivos..

Participa en el tema ayuda con registros, archivos.. en el foro Programación.
que tal.. estoy con unas cosas de la facu, en linux y C++.. y recien ...

Buscar en este tema:
 
  •  
    #1 ayuda con registros, archivos..
    que tal..
    estoy con unas cosas de la facu, en linux y C++.. y recien empiezo a trabajar con archivos

    la cosa es q necesito guardar registros (estoy probando con un Struct alumno) en archivos..
    estuve probando con:
    fd= fopen("grabar_registos.bin", "w+b");
    fwrite(&unAlumno, sizeof(unAlumno), 1, fd);

    el archivo lo crea, aunq no se si lo graba bien
    y dps no se como leer el contenido

    si alguno conoce algun buen manual, tutorial o algo para entender mejor el tema le agradezco
    algo q me clarifique como escribir en el archivo

    tmb necesito info de serializacion
    alguna idea basica de lo q es serializar??
    q seria serializar un registro para dps guardarlo en un archivo??


    gracias!!
    +
     
    0
    Me gusta
     
    | Más
  • #2 Re: ayuda con registros, archivos..

    Originalmente publicado por pbatalla Ver mensaje
    que tal..
    estoy con unas cosas de la facu, en linux y C++.. y recien empiezo a trabajar con archivos

    la cosa es q necesito guardar registros (estoy probando con un Struct alumno) en archivos..
    estuve probando con:
    fd= fopen("grabar_registos.bin", "w+b");
    fwrite(&unAlumno, sizeof(unAlumno), 1, fd);

    el archivo lo crea, aunq no se si lo graba bien
    y dps no se como leer el contenido

    si alguno conoce algun buen manual, tutorial o algo para entender mejor el tema le agradezco
    algo q me clarifique como escribir en el archivo

    tmb necesito info de serializacion
    alguna idea basica de lo q es serializar??
    q seria serializar un registro para dps guardarlo en un archivo??


    gracias!!
    En principio esta bien lo que haces, para escribir el registro... Acordate de hacer un fclose porque si cerras el programa sin hacer un fclose puede ser que los datos del archivo queden corruptos... Porque en cualquier S.O. todas las llamadas al sistema y manejo de I/O se bufferean internamente para ganar rapidez y se difieren, si no cerras tal vez alguno de esos datos no sean guardados a disco...

    Por otro lado para leer lo que tenes que hacer es la inversa...

    struct alumno_t alumno;
    int cantidadLeidos;

    cantidadLeidos = fread(&alumno, sizeof(alumno), 1, archivo);

    if (cantidadLeidos != 1) {
    printf("Hubo error al leer del archivo");
    }

    Saludos
    Pablo
    Me gusta este mensaje
  • #3 Re: ayuda con registros, archivos..

    te pongo el codigo q tengo..

    int main( int argc, char* argv[] ){

    struct alumno{
    int padron;
    const char* nombre;
    int materias_aprobadas;
    };

    alumno unAlumno;
    unAlumno.nombre= "Juan Perez";
    unAlumno.padron= 86332;
    unAlumno.materias_aprobadas= 19;


    FILE* fd;

    //abre el archivo, si no existe lo crea
    fd= fopen("grabar_registos.bin", "w+b");
    fwrite(&unAlumno, sizeof(unAlumno), 1, fd);


    fclose(fd);
    }



    no entendi la ultima parte q me pusiste..

    q seria el "struct alumno_t alumno"???

    dps entiendo lo q haces.. lees y te fijas si leyo un registro, q en teoria es lo unico q tengo e mi archivo
    pero si quiero " recuperar" ese registro como hago?? osea, leerlo del archivo para poder tenerlo y ver sus campos, imprimir por pantalla el nombre por ej
    Me gusta este mensaje
  • #4 Re: ayuda con registros, archivos..

    Originalmente publicado por pbatalla Ver mensaje
    te pongo el codigo q tengo..

    int main( int argc, char* argv[] ){

    struct alumno{
    int padron;
    const char* nombre;
    int materias_aprobadas;
    };

    alumno unAlumno;
    unAlumno.nombre= "Juan Perez";
    unAlumno.padron= 86332;
    unAlumno.materias_aprobadas= 19;


    FILE* fd;

    //abre el archivo, si no existe lo crea
    fd= fopen("grabar_registos.bin", "w+b");
    fwrite(&unAlumno, sizeof(unAlumno), 1, fd);


    fclose(fd);
    }



    no entendi la ultima parte q me pusiste..

    q seria el "struct alumno_t alumno"???

    dps entiendo lo q haces.. lees y te fijas si leyo un registro, q en teoria es lo unico q tengo e mi archivo
    pero si quiero " recuperar" ese registro como hago?? osea, leerlo del archivo para poder tenerlo y ver sus campos, imprimir por pantalla el nombre por ej
    Que en ansi C estandard, cuando vos tenes un struct llamado alumno_t y no hiciste un typedef de ese struct a otro nombre, cada variable que declares le tenes que anteponer el struct, sino el compilador se queja...

    Saludos
    Pablo
    Me gusta este mensaje
  • #5 Re: ayuda con registros, archivos..

    Tu problema esta en que tu estructura alumno se compone de:
    Originalmente publicado por pbatalla Ver mensaje
    Código:
        struct alumno{
            int padron; [1]
            const char* nombre;  [2]
            int materias_aprobadas;  [3]
        };
    
    1. un entero
    2. un puntero
    3. un entero

    Código:
        fwrite(&unAlumno, sizeof(unAlumno), 1, fd);
    
    Por lo tanto, lo que estás grabando en el disco es
    1. un entero
    2. un puntero
    3. un entero

    ¿Y todas las letras 'J', 'u', 'a', .. etc.. del nombre? En tu estructura sólo tenías un puntero a ellas, que es lo que se grabó. Por supuesto, cuando recuperás la estructura, es tan probable que el puntero apunte a algo válido en memoria como ganar la lotería...

    Si querés que se grabe el nombre, hacelo parte de la estructura:
    Código:
    struct alumno {
      int padron;
      char nombre[50];
      int materias_aprobadas;
    }
    ...y después...
      strcpy(unAlumno.nombre, "Juan Perez");
    
    Saludos.
    Me gusta este mensaje
  • #6 Re: ayuda con registros, archivos..

    Originalmente publicado por pbatalla Ver mensaje
    te pongo el codigo q tengo..

    dps entiendo lo q haces.. lees y te fijas si leyo un registro, q en teoria es lo unico q tengo e mi archivo
    pero si quiero " recuperar" ese registro como hago?? osea, leerlo del archivo para poder tenerlo y ver sus campos, imprimir por pantalla el nombre por ej
    Para recuperar los registros solo necesitas hacer un fread, tal como lo explicó ExtrañoInocente.
    Para que funcione correctamente, es necesario que corrijas lo que te indicó pangus, en la definición de la estructura.
    Saludos
    Me gusta este mensaje
  • #7 Re: ayuda con registros, archivos..

    ok.. ya solucione eso, y pude leer el registro

    ahora, una pregunta
    si yo guarde distintos tipos de registros (Alumnos, Docentes, etc) como hago para levantar el registro sin errarle al tipo de dato??
    porq yo hice "fread(&alumno, sizeof(alumno), 1, archivo);"..
    osea, yo hice un fread y puse que me guarde el valor de registro en una variable del tipo Alumno (&alumno).. pero si tengo mezclados Alumnos y Docentes???

    graciass por todas las rtas.. me sirvieron mucho!!
    Me gusta este mensaje
  • #8 Re: ayuda con registros, archivos..

    Depende de cómo y por qué tenés mezclados alumnos y docentes. Podés (a) guardar alumnos y docentes por separado en distintos archivos, (b) crear una union con una struct alumno y una struct docente y grabar variables de ese tipo, (c) grabar directamente, (ch) etc...

    Todo depende de la situación. Explicá más el contexto.
    Me gusta este mensaje
  • #9 Re: ayuda con registros, archivos..

    dentro de una archivo se ingresan de forma indiferente datos (registros) de docente y de alumnos..

    entonces necesitaria, c/vez q leo con fread un registro, "ver" q tipo de registro es, para luego tratarlo de la forma adecuada (si es alumno, tratarlo como alumno)..

    algo asi como el "instanceof" o el ".getClass()" de Java
    no se si se entiende..
    Me gusta este mensaje
  • #10 Re: ayuda con registros, archivos..

    Lo que tenés que hacer es crear un tipo de dato que pueda contener o a un docente o a un alumno y grabar y levantar ítems de ese tipo. También necesitás ponerle una etiqueta para saber si lo que levantás es un alumno o un docente. Hacé algo como esto:
    Código:
    struct alumno { ... };
    struct docente { ... };
    
    enum es_alumno_o_docente { es_alumno, es_docente };
    struct alumno_o_docente {
      enum es_alumno_o_docente que_es;
      union {
        struct alumno a;
        struct docente d;
      } v;
    };
    
    y más adelante...
    
    struct alumno unAlumno;
    struct docente unDocente;
    struct alumno_o_docente unoDeEllos;
    
    /* si tenés un alumno... */
    unoDeEllos.que_es = es_alumno;
    unoDeEllos.v.a = unAlumno;
    fwrite(&unoDeEllos, sizeof(unoDeEllos), 1, fd);
    /* para leer */
    fread(&unoDeEllos, sizeof(unoDeEllos), 1, fd);
    if (unoDeEllos.que_es == es_alumno) {
      unAlumno = unoDeEllos.v.a;
      /* hacer algo con unAlumno ... */
      etc 
    Saludos.
    Me gusta este mensaje
Estás en: Inicio >> Foros >> Informática >> Programación


Estadísticas del tema
  • 9 RESPUESTAS
  • 194 VISTAS
  • 4 USUARIOS RESPONDIERON
 
Ir arriba
Contacto | Acerca de | Ayuda | Términos Legales | privacidad | Pautas de convivencia | Mapa de los foros | TrabajÁ con nosotros
©2008 Psicofxp.com S.A. - Todos los derechos reservados
Certifica IAB