Code:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char name[10];
int no;
} TAM;
typedef struct {
char name[10];
char ch;
} HARF;
typedef struct {
int numTams;
int numHarfs;
TAM *tams;
HARF *harfs;
} DENEME;
DENEME *allocDenemes ( int numDenemes ) {
int i, j;
DENEME *d = malloc ( numDenemes * sizeof *d );
for ( i = 0 ; i < numDenemes ; i++ ) {
d[i].numTams = i + 1;
d[i].numHarfs= i + 2;
d[i].tams = malloc ( d[i].numTams * sizeof *d[i].tams );
d[i].harfs = malloc ( d[i].numHarfs* sizeof *d[i].harfs );
for ( j = 0 ; j < d[i].numTams ; j++ ) {
sprintf( d[i].tams[j].name, "Name %d", i + j );
d[i].tams[j].no = i + j;
}
for ( j = 0 ; j < d[i].numHarfs ; j++ ) {
sprintf( d[i].harfs[j].name, "Name %d", i + j );
d[i].harfs[j].ch = i + j + 'a';
}
}
return d;
}
void freeDenemes ( DENEME *d, int numDenemes ) {
int i;
for ( i = 0 ; i < numDenemes; i++ ) {
free ( d[i].tams );
free ( d[i].harfs );
}
free ( d );
}
void printDenemes ( DENEME *d, int numDenemes ) {
int i, j;
for ( i = 0 ; i < numDenemes; i++ ) {
printf( "TAMS for %d\n", i );
for ( j = 0 ; j < d[i].numTams ; j++ ) {
printf ( "-- Name=%s, no=%d\n",
d[i].tams[j].name, d[i].tams[j].no );
}
printf( "HARFS for %d\n", i );
for ( j = 0 ; j < d[i].numHarfs ; j++ ) {
printf ( "-- Name=%s, ch=%c\n",
d[i].harfs[j].name, d[i].harfs[j].ch );
}
}
}
void saveDenemes ( DENEME *d, int numDenemes, const char *filename ) {
int i;
FILE *fp = fopen ( filename, "wb" );
fwrite ( &numDenemes, sizeof numDenemes, 1, fp ); /* total number */
for ( i = 0 ; i < numDenemes ; i++ ) {
/* write out how many of each record we have */
fwrite ( &d[i].numTams, sizeof d[i].numTams, 1, fp );
fwrite ( &d[i].numHarfs, sizeof d[i].numHarfs, 1, fp );
/* write out the records */
fwrite ( d[i].tams, sizeof *d[i].tams, d[i].numTams, fp );
fwrite ( d[i].harfs, sizeof *d[i].harfs, d[i].numHarfs, fp );
}
fclose ( fp );
}
DENEME *loadDenemes ( int *numDenemes, const char *filename ) {
int i;
FILE *fp = fopen ( filename, "rb" );
DENEME *d;
fread ( numDenemes, sizeof *numDenemes, 1, fp ); /* total number */
d = malloc ( *numDenemes * sizeof *d );
for ( i = 0 ; i < *numDenemes ; i++ ) {
/* read in how many of each record we have */
fread ( &d[i].numTams, sizeof d[i].numTams, 1, fp );
fread ( &d[i].numHarfs, sizeof d[i].numHarfs, 1, fp );
/* allocate space for the records we're about to read */
d[i].tams = malloc(sizeof(TAM)*d[i].numTams);
d[i].harfs = malloc(sizeof(TAM)*d[i].numHarfs);
/* read in the records */
fread ( d[i].tams, sizeof *d[i].tams, d[i].numTams, fp );
fread ( d[i].harfs, sizeof *d[i].harfs, d[i].numHarfs, fp );
}
fclose ( fp );
return d;
}
int main ( void ) {
const char *filename = "savedata.dat";
int numDenemes = 2; /* some number */
DENEME *d;
printf( "Initialise, print it, save it and free\n" );
d = allocDenemes ( numDenemes );
printDenemes ( d, numDenemes );
saveDenemes ( d, numDenemes, filename );
freeDenemes ( d, numDenemes );
printf( "\nLoad it, print it and free\n" );
d = loadDenemes ( &numDenemes, filename );
printDenemes ( d, numDenemes );
freeDenemes ( d, numDenemes );
return 0;
}
$ ./a.out
Initialise, print it, save it and free
TAMS for 0
-- Name=Name 0, no=0
HARFS for 0
-- Name=Name 0, ch=a
-- Name=Name 1, ch=b
TAMS for 1
-- Name=Name 1, no=1
-- Name=Name 2, no=2
HARFS for 1
-- Name=Name 1, ch=b
-- Name=Name 2, ch=c
-- Name=Name 3, ch=d
Load it, print it and free
TAMS for 0
-- Name=Name 0, no=0
HARFS for 0
-- Name=Name 0, ch=a
-- Name=Name 1, ch=b
TAMS for 1
-- Name=Name 1, no=1
-- Name=Name 2, no=2
HARFS for 1
-- Name=Name 1, ch=b
-- Name=Name 2, ch=c
-- Name=Name 3, ch=d