从文件里读数据到屏幕

#include"food.h"


int main(void)
{

    food_pnode h;

    foodlist_init(&h);
    foodlist_read(h);
    foodlist_show(h);
    
    return 0;
}

void  foodlist_init(food_pnode *H)
{
        *H=(food_pnode)malloc(sizeof(food_node));
        if(NULL==*H){
            printf("malloc error\n");
            exit(-1);
        }
        INIT_LIST_HEAD(&(*H)->list);
}


void foodlist_creat(food_pnode h,food_node food_menu)
{
    food_pnode new;
        new=(food_pnode)malloc(sizeof(food_node));
        if(NULL==new){
            printf("malloc error!\n");
            exit(-1);
        }

        *new=food_menu;
        list_add_tail(&new->list,&h->list);
    

}
void foodlist_read(food_pnode h)
{
    FILE *fp;
    food_node food_menu;
    int n=0;
    char buf[150];
    fp=fopen("food.dat","r");
    if(fp==NULL){
    printf("open error\n");
    exit(-1);
    }
    
    while(fgets(buf,1024,fp))
    n++;    

    fseek(fp,0,SEEK_SET);
    while(n--)
{       
    fscanf(fp,"%d%s%d",&food_menu.number,food_menu.name,&food_menu.price);
    foodlist_creat(h,food_menu);

}
    fclose(fp);

}
void foodlist_show(food_pnode h)
{
    struct list_head *pos,*n;
    food_pnode p;
    
    list_for_each_safe(pos,n,&(h->list))
    {
    p=list_entry(pos,food_node,list);
    printf("%d\t%s\t%d\t\n",p->number,p->name,p->price);

    }


}

思路:1.内核链表初始化,创建一个内核链表类型的头结点

      INIT_LIST_HEAD(&(*H)->list);

     2.打开文件fp=fopen("food.dat","r");

         3.创建一个结构体   接受文件读出来的每行

           food_node food_menu;

         4.计算行数

         while(fgets(buf,1024,fp))
         n++;

         5.定位到文件开头

   fseek(fp,0,SEEK_SET);

         6.边读边创建

    fscanf(fp,"%d%s%d",&food_menu.number,food_menu.name,&food_menu.price);

          foodlist_creat(h,food_menu);

        7.创建用new=(food_pnode)malloc(sizeof(food_node));

  8.把读出的内容赋给新结点

       *new=food_menu;

  9.list_add_tail(&new->list,&h->list);插到表尾

   10. 遍历显示

 

posted @ 2014-04-06 22:23  小小梦想不停追  阅读(159)  评论(0)    收藏  举报