2013-05-03 3 views
0

код предназначен для создания покупки магазина, системы поддержания запасов У меня есть проблема с вводом данных из файла txt в связанный список с fscanf (fp, ....... .....) функция;читать данные из файла txt в связанном списке

Приведенный ниже код имеет проблемы, описанные в разделе комментариев, но при использовании кода в turbo c и ввода данных во время выполнения содержимое идет в файл правильно, если я не читаю более старое содержимое. каждый раз, когда я открываю программу, файл переопределяется. Когда я читаю содержимое с помощью fscanf() значения нежелательной почты начинают добавляться в файл, я не знаю, почему. может быть потому, что я использую указатели вместо объектов, но я не знаю другого пути.

Я знаю, что моя программа неэффективна, но все же я хочу знать, в чем проблема с кодом и как его решить. Я использовал множество переменных, некоторые из них никогда не будут использоваться, прошу простить меня. проблемы в коде будет найдена в функции создания:

#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 

благодаря

+4

Пожалуйста, уменьшите код до тестового теста _minimal_, который воспроизводит вашу проблему, и узнайте, как использовать отладчик/посыпать свой код с помощью printfs, чтобы выяснить, что он делает. – Mat

+0

Пожалуйста, сократите код до [соответствующих частей] (http://sscce.org/) - и отформатируйте его. –

+0

@ Соответствующая часть - это чтение файла, помеченного комментариями в create function.i, не знаю, как добавлять блоки кода в этот раздел комментариев. проблема заключается в чтении файла в связанном списке. извините за неудобства –

ответ

1

Подобно тому, как зсап, fscanf требует местоположений/адресов, где он будет хранить информацию, обозначенную в формате аргумент. После использования не является правильным:

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

Поскольку ни m->quantity ни m->price не являются действительными адресами, вы должны использовать & оператор:

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

этот код, который вы дали, правильно читает содержимое в связанном списке, но с некоторыми значениями нежелательной почты. раньше все было мусором, за исключением строк и различных строк.теперь количество и цены читаются, но добавляются 1 или 2 нежелательных блока с нежелательной (цена и количество имен). PLS помощи. спасибо за вышеупомянутую помощь также. –

+0

Вы должны просмотреть данные, которые записываются в файл, я больше не могу смотреть на полный код. Но если я правильно помню, я обнаружил подобную ошибку в scanf(), вы делали что-то вроде: 'scanf («% s », & m-> name);', что также неверно. –

1

обработки для fscanf() Вашего возвращаемого значения выключено.

Он не возвращает указатель, он возвращает int, see the documentation. Целое число - это количество успешных конверсий; вы должны сопоставить значение с nunber спецификаторов % в строке формата.

И ему нужны указатели на то, где должны храниться данные; целочисленное преобразование, такое как %d, нуждается в адресе int, то есть &m->quantity в вашем коде.

Также don't cast the return value of malloc() в C. В самом деле, перепишем

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

как:

d = malloc(sizeof *d); 

для улучшения четкости, меньше повторений, и более краткости.