C/Visual C - Guardar en archivo estructura c/memoria reservada con malloc

 
Vista:

Guardar en archivo estructura c/memoria reservada con malloc

Publicado por Cristian (1 intervención) el 06/09/2012 22:05:51
Lo que estoy tratando de hacer en general es un archivo compuesto de una estructura cuyos registros son de largo variable, para ello, le hago un malloc() mediante puntero, a la estructura temporal del programa que se ve ahí abajo, e ingreso los datos. El problema surge cuando yo trato de guardar los datos a archivo, ya que no sé si efectivamente se guardaron, lo anterior se responde al querer intentar revisar el contenido mediante un programa alternativo.

Este es el programa para guardar los datos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct stCrimeArchive {
   char id_student[10];
   int id_document;
   char judgement[30];
   int id_crime;
   char date[12];
   char id_police[12];
};
 
int main()
{
   struct stCrimeArchive *regi;
   FILE *filea;
   filea = fopen("crimearchives.dat", "r+b");
   if(!filea)
 filea = fopen("crimearchives.dat", "w+b");
 
   int i;
   char num[6];
 
   regi = (struct stCrimeArchive*)malloc (sizeof(struct stCrimeArchive));
 
   printf("ID DOCUMENT: ");
   fgets(num, 6, stdin);
   regi->id_document= atoi(num);
 
   printf("ID STUDENT: ");
   fgets(regi->id_student, 30, stdin);
   for(i = strlen(regi->id_student)-1; i && regi->id_student[i] < ' '; i--)
    regi->id_student[i] = 0;
 
   printf("CRIME CODE: ");
   fgets(num, 6, stdin);
   regi->id_crime = atoi(num);
 
   printf("DATE OF THE CRIME: ");
   fgets(regi->date, 30, stdin);
   for(i = strlen(regi->date)-1; i && regi->date[i] < ' '; i--)
    regi->date[i] = 0;
 
   printf("ID POLICE: ");
   fgets(regi->id_police, 30, stdin);
   for(i = strlen(regi->id_police)-1; i && regi->id_police[i] < ' '; i--)
    regi->id_police[i] = 0;
 
   printf("JUDGEMENT: ");
   fgets(regi->judgement, 30, stdin);
   for(i = strlen(regi->judgement)-1; i && regi->judgement[i] < ' '; i--)
    regi->judgement[i] = 0;
 
   fseek(filea, 0, SEEK_END);
   fwrite(&regi, sizeof(*regi), 1, filea);
 
   free(regi);
   fclose(filea);
}


Y este es el programa para querer revisar los datos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct stCrimeArchive {
   char id_student[10];
   int id_document;
   char judgement[30];
   int id_crime;
   char date[12];
   char id_police[12];
};
 
int main()
{
   struct stCrimeArchive *regi;
   // regi = (struct stCrimeArchive*)malloc (sizeof(struct stCrimeArchive));
   FILE *filea;
   filea = fopen("crimearchives.dat", "r+b");
   if(!filea)
    filea = fopen("crimearchives.dat", "w+b");
   rewind(filea);
   while  (fread(&regi, sizeof(struct stCrimeArchive), 1, filea))
    printf("%2d %-11s %-11s %8d %-13s %-14s\n", regi->id_document, regi->id_police, regi->date, regi->id_crime, regi->id_student, regi->judgement);
   fclose(filea);
}


Sé que al hacer el malloc mediante puntero a la estructura y guardar los datos correspondientes no tengo problema, pero lo que no puedo hacer todavía (y me está calentando la cabeza) es que se guarden bien a archivo y asegurarme de que los datos que yo ingresé efectivamente estan ahí.

No sé que estoy haciendo mal al guardar el archivo, y tampoco sé que estoy haciendo mal al abrir el archivo.

De antemano se agradece la ayuda.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Guardar en archivo estructura c/memoria reservada con malloc

Publicado por Capitan Kirk (97 intervenciones) el 07/09/2012 08:49:10
En el programa para leer el archivo, has definido regi como puntero a stCrimeArchive, pero a continuación tienes como comentario la instrucción en la que le asignas la memoria, con lo cual regi es un puntero que está apuntando a quién sabe donde.

Más adelante, en fread estás pasando la dirección del puntero a datos en lugar del propio puntero, con lo que los datos leídos del fichero te los coloca en vete a saber.

Resumiendo:

El programa que te crea el archivo parece estar correcto, no le aprecio errores.

En el programa que te lee el archivo, descomenta la línea con la instrucción malloc, y en la instrucción en la que lees el archivo, pon

fread (regi, ...

en lugar de

fread (&regi, ...

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Guardar en archivo estructura c/memoria reservada con malloc

Publicado por Sr Spock (2 intervenciones) el 20/09/2012 00:13:32
Y además, lo mismo ocurre a la hora de guardar el registro.

Escribes:

fwrite(&regi, sizeof(*regi), 1, filea);

cuando lo correcto sería

fwrite(regi, sizeof(*regi), 1, filea);

ya que 'regi' es un puntero. Si
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar