user rk
user rk

Reputation: 396

read data from txt file to linked list

the code is for creating a shop purchase, stock maintainence system i have a problem in entering data from txt file to linked list with fscanf(fp,............) function;

the code below has the problems written in comments section but breifly, when i run the code in turbo c and enter the data at run time the contents go in the file correctly if i am not reading in older contents. every time i open the program the file is overridden. when i read in the contents with fscanf() junk values start to get added in the file i dont know why. may be because i am using pointers instead of objects, but i do not know another way.

i know that my program is inefficient but still i want to know what is the problem with the code and how to resolve it i have used many variables , some of them might never be used ,pls forgive me. problem in the code will be found in the create function:

#include<alloc.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<graphics.h>
#define size 20
struct shop{
char name[size];
int quantity;
int price;
struct shop *next;
}*start;
typedef struct shop sh;

char u_name[30];
char u_pass[30];

int i,user,password;
int k=0,l=0;
char add_more;
char c,choice,c1,more;




void create()
{ FILE *fc,*fp;

struct shop *ptr,*temp,*g,*l,*m,*t,*i,*d;
char ch,v[20];
int r,z,w,flag=0;
//the code ***************from here******************
fc=fopen("storedata.txt","r");
d=(sh*)malloc (sizeof(sh));
d->next=NULL  ;
i=d;
m=d;


while(fscanf(fc,"%s\t%d\t%d",m->name,m->quantity,m->price)!=EOF)
{
d=(sh*)malloc (sizeof(sh));
m->next=d;
m=m->next;

}
m->next=NULL;
fclose(fc);

t=i;

clrscr();
printf("NAME\t\t\tQUANTITY\t\t\t\tPRICE(RS)");

do
{
printf("\n%s ",t->name);
printf("\t\t\t%-20d",t->quantity);
printf("\t\t\t%-40d",t->price);
t=t->next;
}while(t!=NULL);
 getch();
 getch();
//*************till here********the smaller code part above is the code to read in the file which doesnt work correctly
start=i;}  // when i remove this line all the values entered in the file are correct but file is overridden every time i run it

thanks

Upvotes: 0

Views: 4183

Answers (2)

unwind
unwind

Reputation: 399793

Your return value handling for fscanf() is off.

It doesn't return a pointer, it returns an int, see the documentation. The integer is the number of successful conversions; you should match the value to the nunber of % specifiers in your format string.

And it needs pointers to where data should be stored; an integer conversion like %d needs an address of an int, i.e. &m->quantity in your code.

Also don't cast the return value of malloc() in C. In fact, re-write

d=(sh*)malloc (sizeof(sh));

as:

d = malloc(sizeof *d);

for improved clarity, less repetition, and more brevity.

Upvotes: 1

Julio Moreno
Julio Moreno

Reputation: 211

Just as scanf, fscanf requires the locations/addresses where it will store the information denoted by the format argument. Following usage is not correct:

fscanf(fc,"%s\t%d\t%d",m->name,m->quantity,m->price);

Since neither m->quantity nor m->price are valid addresses, you should use & operator:

fscanf(fc,"%s\t%d\t%d",m->name,&m->quantity,&m->price);

Upvotes: 1

Related Questions