Delete writer.dat and test again. I recompiled the code with my modification and works OK.
I use gcc, not turbo C, but this does not matter anyway for both supports ANSI.
Be sure also to input 5 records and nos. 1,2,3,4,5 complete. And put back your original read routine (w/o fseek).
Code:
#include <stdio.h>
#include <string.h>
#define INDEX 5
#define getch getchar
#define clrscr()
struct entry{
char name[20];
float owes;
}my_data[INDEX];
main()
{
char letra;
int x;
for(x=0;x<INDEX;x++)
{
my_data[x].owes=0;
}
do
{
clrscr();
printf("\nW-rite R-ead Q-uit");
letra=getch();
switch(toupper(letra))
{
case('W'):
writer();
break;
case('R'):
reader();
break;
case('Q'):
break;
}
}while((toupper(letra))!='Q');
}
writer()
{
int x;
float owe;
char st[20];
FILE *file_pointer;
if((file_pointer=fopen("writer.dat","a"))!=NULL)
{
printf("\nEnter no. ");
scanf("%d",&x);
printf("\nEnter name: ");
scanf("%s",&st);
strcpy(my_data[x-1].name,st);
printf("\nOwes? ");
scanf("%f",&owe);
my_data[x-1].owes=owe;
printf("\nWRITER");
/* randomly move pointer to the right record position to write */
fseek(file_pointer, (x-1) * sizeof(struct entry), SEEK_SET );
fwrite(&my_data[x-1],sizeof(struct entry),1,file_pointer);
}
else printf("Error writing writer.dat\n");
fclose(file_pointer);
getch();
}
reader()
{
FILE *file_pointer;
struct entry buffer[INDEX];
int x;
if((file_pointer=fopen("writer.dat","r"))==NULL)
{
printf("Error reading writer.dat\n");
}
else
{
printf("\nOwes: ");
rewind(file_pointer);
fread(my_data,sizeof(struct entry),INDEX,file_pointer);
for(x=0;x<INDEX;x++)
{
printf("\nRecord %d %3.2f",x,my_data[x].owes);
}
fclose(file_pointer);
}
getch();
return(0);
}