闲敲棋子落灯花-
2016-09-06 15:43
采纳率: 68.4%
浏览 2.6k
已采纳

c语言读写文件时出现的问题

为什么我我读文件只能出现第一个数据。其他的数据都不会出现。图片说明


图片说明

---------一下是源码

#include
#include
#define N 30
#include
struct recipe{
char food[10];
float price;
struct recipe *next;

};

struct recipe* creat()
{ int x;
int i=0;
struct recipe *head,*p,*tail;
head=tail=NULL;
printf("请输入新添加的菜品数量:");
scanf("%d",&x);
for(i=0;i p=(struct recipe *)malloc(sizeof(struct recipe));
if(p==NULL)
{ printf("分配内存失败.");
exit(1);
}
p->next=NULL;
printf("请输入菜品的名称:");
scanf("%s",p->food);
printf("请输入菜品价格:");
scanf("%f",&p->price);

if(head==NULL)
{   
    head=p;
    tail=p;
}
else
{  tail->next=p;
   tail=p;
}
}
return head;

}
void displayRecipe(struct recipe *p)
{

printf("\t\t菜名--------------------------------价格\n");
while(p!=NULL)
{

printf("\t\t%s-------------------------------%f\n",p->food,p->price);
p=p->next;
}

}

int choosemenu(){

printf("\t\t\t[1]输入新的菜品信息\n");

printf("\t\t\t[2]查看现有菜品信息\t\n");

printf("\t\t\t[3]将现有菜品价格从小到大排序\t\n");

printf("\t\t\t[4]查找现有菜品信息\t\n");

printf("\t\t\t[5]删除现有菜品信息\t\n");

printf("\t\t\t[6]保存修改菜品信息\t\n");

printf("\t\t\t[7]退出菜品信息管理系统\t\n");

printf("\t\t\t[8]读取已有文件信息.\t\n");

printf("\t\t\t[9]清屏。\t\n");

printf("\t\t\t请选择:    \n");

return  0;

}

struct recipe *Newsth(struct recipe *p)
{
struct recipe *m;
if((m=(struct recipe *)malloc(sizeof(struct recipe)))==NULL)
{
printf("分配内存失败");
exit(1);
}

printf("请输入新输入的菜品名称:");
scanf("%s",m->food);
printf("请输入新输入的菜品价格:");
scanf("%f",&m->price);
m->next=p;
return m;

}

struct recipe *sort(struct recipe *b)
{
struct recipe *p,*pre_min,*min,*first,*tail;
first=NULL;
while(b->next!=NULL)
{
for(p=b,min=b;p->next!=NULL;p=p->next)
{
if((p->next->price)<(min->price))
{
pre_min=p;//保留当前所找到最小节点的前驱节点
min=p->next;//保留当前最小节点
}

    }
    if(b==min)
    {
        b=b->next;
    }
    else
    {
        pre_min->next=min->next;//将当前最小节点移出链表
    }
    if(first==NULL)
    {
        first=min;
        tail=first;
    }
    else
    { 
        tail->next=min;
        tail=min;

    }

}

if(b->next==NULL)
    {
        tail->next=b;
        tail=b;

    }
return first;

}

void search(struct recipe *d)
{ char name[10];
printf("请输入需要查找的菜品名称:");
scanf("%s",name);
while(strcmp(d->food,name)!=0)
{
d=d->next;
if(d==NULL){
printf("输入有误,请重新输入.\n");
break;}
}
if(d!=NULL) printf("你要查找的菜品信息为%s,价格为%f\n",d->food,d->price);

}

struct recipe *Delete(struct recipe *h)
{ struct recipe *f,*j,*start;
char target[10];
start=h;
start->next=h->next;
printf("请输入你想要删除的菜品的名称:");
scanf("%s",target);

while(strcmp(h->food,target)!=0)
{
    if(h->next->next==NULL)
        j=h;

    h=h->next;

}

    if(h->next==NULL)
    {
        j->next=NULL;
        free(h);

    }

    else{
    strcpy(h->food,h->next->food);
    h->price=h->next->price;
    f=h->next;
    if(h->next->next!=NULL)
    h->next=h->next->next;
    else h->next=NULL;
    free(f);
    }
return start;

}
void save(struct recipe *g)
{
FILE *fp;
if((fp=fopen("d:\recipe.txt","w"))==NULL)
{
printf("无法打开文件.\n");
exit(0);
}

while(g!=NULL)
{
    fprintf(fp,"\t\t%s\t\t\t%f\n",g->food,g->price);
    g=g->next;
}
fclose(fp);

}

void read(struct recipe *j){

FILE *f;
if((f=fopen("d://recipe.txt","r"))==NULL)
{
    printf("无法读取文件.\n");
    exit(0);
}
while(j!=NULL)
{
    fscanf(f,"\t\t%s\t\t\t%f\n",j->food,&j->price);

    printf("\t\t%s\t\t\t%f\n",j->food,j->price);
    j=j->next;
}

fclose(f);

}

void cls()
{
system("cls");
}

void main(){
int n=0;

struct recipe *head=NULL;

printf("--------------------欢迎进入订餐管理系统--------------------------\n");
printf("-------首次进入请确认你已写好菜品信息--------\n");
head=creat();
system("cls");

while(n!=7){
    choosemenu();
    scanf("%d",&n);
    switch(n){
case  1:head=Newsth(head);
         break;
case  2:displayRecipe(head);
    break;
case  3:head=sort(head);
    break;
case  4:search(head);
    break;
case  5:head=Delete(head);
    break;
case  6:save(head);
    break;
case  7:printf("Thanks for your use!\n\n\n\n");
    break;
case 8:read(head);
    break;
case  9:cls();
    break;
default:choosemenu();
    printf("输入有误,请重新输入.\n");

}
}
system("pause");

}

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • 看得到你的人头 2016-09-07 09:11
    已采纳

    你把read的函数修改一下即可

     void read(struct recipe *j)
    {
        struct recipe *p,*p1,*p2;//添加三个结构体指针
        FILE *f;
        if((f=fopen("d://recipe.txt","r"))==NULL)
        {
            printf("无法读取文件.\n");
            exit(0);
        }
        //读取多行
    
        p=(struct recipe *)malloc(sizeof(struct recipe));//新开辟空间
        j->next=p;
        p1=p;
        while (2==fscanf(f,"\t\t%s\t\t\t%f\n",p1->food,&p1->price))//读取文件中的数据,每次读取一行
        {
            printf("\t\t%s\t\t\t%f\n",p1->food,p1->price);//打印
            //新开辟一个空间,然后再来读取,并连接到原有链表上
            p=(struct recipe *)malloc(sizeof(struct recipe));
            p2=p1;
            p1->next=p;
            p1=p;
        }
        free(p);//释放无用指针
        p=NULL;
        p2->next=NULL;
        fclose(f);
    }
    

    运行结果如下:
    图片说明
    图片说明

    已采纳该答案
    打赏 评论
  • huskyui 2016-09-07 03:23

    来份源码,2207019991

    打赏 评论
  • 闲敲棋子落灯花- 2016-09-09 03:30

    void read(struct recipe *j)
    {
    struct recipe *p,*p1,*p2;//添加三个结构体指针
    FILE *f;
    if((f=fopen("d://recipe.txt","r"))==NULL)
    {
    printf("无法读取文件.\n");
    exit(0);
    }
    //读取多行

    p=(struct recipe *)malloc(sizeof(struct recipe));//新开辟空间
    while(j->next!=NULL)
        j=j->next;//这样就可以实现将上次保存的数据直接读取到现在建立的链表中去,实现一个多次运用
    j->next=p;
    p1=p;
    while (2==fscanf(f,"\t\t%s\t\t\t%f\n",p1->food,&p1->price))//读取文件中的数据,每次读取一行
    {
        printf("\t\t%s\t\t\t%f\n",p1->food,p1->price);//打印
        //新开辟一个空间,然后再来读取,并连接到原有链表上
        p=(struct recipe *)malloc(sizeof(struct recipe));
    
        p2=p1;
        p1->next=p;
        p1=p;
    }
    free(p);//释放无用指针
    p=NULL;
    p2->next=NULL;
    fclose(f);
    

    }

    打赏 评论

相关推荐 更多相似问题