Write structure into file : Structure Serialization « Structure « C / ANSI-C






Write structure into file

/*
C & Data Structures

Published in Feb 2004 by CHARLES RIVER MEDIA

Author: P. S. Deshpande, O. G. Kakde
SKU: 1584503386

ISBN: 1584503386
*/ 
  

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 50


typedef struct {
    char  name[10];
    int key;
} file_record;

/* this function adds the relatiuve addres to the index for a key */
void create_index(long index[], int key, long rel_add ) {
    index[key] = rel_add;
}

/* this function writes a record to the file */
void write_rec(FILE *fp, file_record rec) {
   fwrite(&rec,sizeof(rec),1,fp);
}

void main() {
    long rel_add;
    int key;
    file_record frec;
    long index[MAX];/* an index list*/
    int n,i;

    FILE *recfile=NULL,*ifile=NULL;
    /* this initializes the index list to all ? */
    for(i=0; i< MAX; i++)
        index[i]= (-1);

    recfile=fopen("mfile","w");
    if(recfile == NULL) {
        printf("Error in openeing file mfile\n");
        exit(0);
    }
    rel_add = 0 ;
    do {
        printf(" Enter the data vlue and the key of the record to be added to file mfile\n");
        scanf("%s %d",frec.name,&frec.key);
        while(index[frec.key] != (-1)) {
            printf(" A record with this key value already exist in a file enter record key value\n");
            scanf("%s %d",frec.name,&frec.key);
        }
        create_index(index,frec.key,rel_add);
         write_rec(recfile,frec);
        rel_add =  ftell(recfile); 
        /* this sets the relative address for the next record to be 
      the value of current file position pointer in bytes from 
      the beginning of the file */
         printf("Enter 1 to continue adding records to the file\n");
         scanf("%d",&n);
    }while(n == 1);
   
    ifile=fopen("index_file","w");
         
    if(ifile == NULL) {
       printf("Error in openeing file index_file\n");
         exit(0);
    }
    
    fwrite(index,sizeof(index),1,ifile);/*writes the complete index into the index_file */
    fclose(recfile);
    fclose(ifile);
    printf("Enter 1 if you want to retrieve a record\n");
    scanf("%d",&n);
    
    if( n == 1) {
       ifile=fopen("index_file","r");
       if(ifile == NULL) {
           printf("Error in openeing file index_file\n");
           exit(0);
       }
       fread(index,sizeof(index),1,ifile);
       
       /* reads the complete index into the index list from the index_file*/
       fclose(ifile);
       recfile=fopen("mfile","r");
       
       if(recfile == NULL) {
           printf("Error in openeing file mfile\n");
           exit(0);
       }
    }
    printf("THE CONTENTS OF FILE IS \n");
    
    while( (fread(&frec,sizeof(frec),1,recfile)) != 0)
         printf("%s %d\n",frec.name,frec.key);
    
    do {
        printf("Enter the key of the record to be retrieved\n");
        scanf("%d",&key);
        rel_add = index[key]; /*gets the relative address of the record from index list */
        if( (fseek(recfile,rel_add,SEEK_SET))!= 0) {
             printf("Error\n");
             exit(0);
        }
        fread(&frec,sizeof(frec),1,recfile);
        printf("The data value of the retrieved record is %s\n",frec.name);
        printf("Enter 1 if you want to retrieve a record\n");
        scanf("%d",&n);
    } while(n == 1);
    
    fclose(recfile);
}


           
       








Related examples in the same category

1.scan a file and print out a list of words in ASCII order