Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[C] Insertar registro de estructura de largo variable

Estas en el tema de [C] Insertar registro de estructura de largo variable en el foro de C/C++ en Foros del Web. Explico, lo que tengo es una estructura que consta de 6 campos del que se compondrá el registro que voy a usar. Lo que necesito ...
  #1 (permalink)  
Antiguo 05/09/2012, 07:42
 
Fecha de Ingreso: mayo-2011
Mensajes: 26
Antigüedad: 12 años, 11 meses
Puntos: 1
[C] Insertar registro de estructura de largo variable

Explico, lo que tengo es una estructura que consta de 6 campos del que se compondrá el registro que voy a usar. Lo que necesito es crear un archivo que va a ser secuencial con registro de largo variable, Para ello, estoy tratando de hacer un programa para que se llenen 5 de los 6 campos anteriormente mencionados, y uno de ellos lo voy a llenar después mediante otro procedimiento.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct stAntecedente {
  6.    char rut_alumno[10];
  7.    int id_documento;
  8.    char sentencia[30];
  9.    int id_delito;
  10.    char fecha[12];
  11.    char rut_polichile[12];
  12. };
  13.  
  14. void InsertarAntecedente(struct stAntecedente *regi)
  15. {
  16.    int i;
  17.    char num[6];
  18.  
  19.    regi = (struct stAntecedente*)malloc (sizeof(struct stAntecedente));
  20.  
  21.    printf("ID del documento: ");
  22.    fgets(num, 6, stdin);
  23.    regi->id_documento = atoi(num);
  24.  
  25.    printf("Rut del alumno: ");
  26.    fgets(regi->rut_alumno, 30, stdin);
  27.    for(i = strlen(regi->rut_alumno)-1; i && regi->rut_alumno[i] < ' '; i--)
  28.     regi->rut_alumno[i] = 0;
  29.  
  30.    printf("Código del delito cometido: ");
  31.    fgets(num, 6, stdin);
  32.    regi->id_delito = atoi(num);
  33.  
  34.    printf("Fecha en que se cometió el delito: ");
  35.    fgets(regi->fecha, 30, stdin);
  36.    for(i = strlen(regi->fecha)-1; i && regi->fecha[i] < ' '; i--)
  37.     regi->fecha[i] = 0;  
  38.  
  39.    printf("RUT del funcionario a cargo: ");
  40.    fgets(regi->rut_polichile, 30, stdin);
  41.    for(i = strlen(regi->rut_polichile)-1; i && regi->rut_polichile[i] < ' '; i--)
  42.     regi->rut_polichile[i] = 0;    
  43.  
  44.    //Este opción introduce una sentencia, pero para este programa no se usa
  45.    /*printf("Sentencia: ");
  46.    fgets(regi->sentencia, 30, stdin);
  47.    for(i = strlen(regi->sentencia)-1; i && regi->sentencia[i] < ' '; i--)
  48.     regi->sentencia[i] = 0; */  
  49. }
  50.  
  51. int main()
  52. {
  53.    struct stAntecedente regi;
  54.    FILE *filea;
  55.    filea = fopen("antecedentes.dat", "r+b");          
  56.    if(!filea)
  57.     filea = fopen("antecedentes.dat", "w+b");
  58.    
  59.    InsertarAntecedente(&regi);
  60.    fseek(filea, 0, SEEK_END);
  61.    fwrite(&regi, sizeof(struct stAntecedente), 1, filea);
  62.    fclose(filea);
  63.    
  64. }

A pesar de que hice reserva de memoria sobre la estructura con la que voy a trabajar, no me resulta la inserción del registro, cosa que ustedes pueden ver con este otro programa que muestra la lista de registros almacenados en ese archivo.
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct stAntecedente {
  6.    char rut_alumno[10];
  7.    int id_documento;
  8.    char sentencia[30];
  9.    int id_delito;
  10.    char fecha[12];
  11.    char rut_polichile[12];
  12. };
  13.  
  14. void MostrarAntecedente (struct stAntecedente *regi)
  15. {
  16.    printf("%2d %-11s %-11s %8d %-13s %-14s\n", regi->id_documento, regi->rut_polichile, regi->fecha, regi->id_delito, regi->rut_alumno, regi->sentencia);
  17. }
  18.  
  19. int main()
  20. {
  21.    /* Mostrar la lista total de antecedentes */
  22.    struct stAntecedente regi;
  23.    FILE *filea;
  24.    filea = fopen("antecedentes.dat", "r+b");          
  25.    if(!filea)
  26.     filea = fopen("antecedentes.dat", "w+b");
  27.    rewind(filea);
  28.    printf("----------------------------------------------------------------\n");
  29.    printf("ID Rut.PCH     Fecha        Delito  Rut. Alumno   Sentencia\n");
  30.    printf("----------------------------------------------------------------\n");
  31.    while  (fread(&regi, sizeof(struct stAntecedente), 1, filea))
  32.     MostrarAntecedente(&regi);
  33.    fclose(filea);
  34. }

No he trabajado antes con largo variable, sino solamente con largo fijo. No sé que más puedo corregir.

De antemano se agradece la ayuda.

Saludos.

Etiquetas: largo, malloc, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:46.