搜索
bottom↓
回复: 21

C语言—文件数据读入到链表里不能实现

[复制链接]

出0入0汤圆

发表于 2014-5-18 13:06:31 | 显示全部楼层 |阅读模式
1.正在做学生管理系统,深刻学习C语言
2.已经可以生成链表(见creat函数),并把生成的链表保存到student.txt文件(见store函数).
3.并且可以打印出生成的链表(见print函数)。
4.不能实现:将student.txt文件的数据读入链表中 (见load函数),求大神指导!
环境VC++ 6.0
上代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "malloc.h"
  4. #include "process.h"
  5. #define LEN sizeof(struct student)

  6. int n;

  7. struct student
  8. {
  9.    long num;
  10.    float score;
  11.    struct student *next;
  12. };









  13. struct student *creat(void)
  14. {
  15.    struct student *head;
  16.    struct student *p1,*p2;
  17.    n=0;
  18.    p1=p2=(struct student *)malloc(LEN);
  19.    scanf("%ld,%f",&p1->num,&p1->score);
  20.    head=NULL;
  21.    while(p1->num!=0)
  22.    {
  23.      n=n+1;
  24.          if(n==1)head=p1;//把首地址给链表头
  25.      else p2->next=p1;//指针下移
  26.          p2=p1;//更新p2指针
  27.          p1=(struct student *)malloc(LEN);//申请新的地址&更新p1指针
  28.          scanf("%ld,%f",&p1->num,&p1->score);

  29.    }
  30.      p2->next=NULL;
  31.          return(head);



  32. }



  33. struct student *print(struct student *head)
  34. {
  35.     struct student *p;

  36.         p=head;
  37.         printf("链表中共用%d条记录\n",n);
  38.         if(head!=NULL)
  39.         {
  40.       
  41.            do
  42.            {
  43.                    printf("%ld,%5.1f\n",p->num,p->score);
  44.                    p=p->next;
  45.            }
  46.        while(p!=NULL);

  47.         }
  48.      return(head);
  49. }


  50. /*
  51.    function:将生成结构体中的数据保存到文件中
  52.    time:2014-5-16 9:42:49
  53.    
  54.    version:V1.0
  55.    input:要存入链表的首地址
  56.    output:void
  57.    链表默认保存到student.txt文件中
  58. */
  59. void store(struct student *head)
  60. {
  61.     FILE *fp;
  62.         struct student *p;
  63.         fp=fopen("student.txt","w+");//新建文件
  64.         if(fp==NULL)
  65.         {
  66.       printf("open file failed");
  67.           exit(0);
  68.         }
  69.         p=head;
  70.     if(head!=NULL)
  71.         {
  72.                 do
  73.                 {
  74.           fprintf(fp,"%ld,%f",p->num,p->score);
  75.                   p=p->next;
  76.                 }
  77.         while(p!=NULL);
  78.         }
  79.         fprintf(fp,"0");
  80.         fclose(fp);//关闭文件
  81.         printf("Linked list store is ok!\n");
  82.        
  83. }


  84. /*
  85.   function:将文件中的数据读入到链表中
  86.   
  87.   time:2014-5-16 10:12:23
  88.   version:V1.0
  89.   input:void
  90.   ouput:返回链表的头指针
  91.   读取默认文件 student.txt
  92. */
  93. struct student *load(void)
  94. {
  95.    FILE *fp;
  96.    struct student *head;
  97.    struct student *p1,*p2;
  98.    fp=fopen("student.txt","r");//打开文件
  99.    rewind(fp);
  100.    if(fp==NULL)
  101.         {
  102.       printf("open file failed");
  103.           exit(0);
  104.         }
  105.   
  106.    n=0;
  107.    head=NULL;
  108.    p1=p2=(struct student *)malloc(LEN);
  109.    fscanf(fp,"%ld,%f",&p1->num,&p1->score);
  110.    while(p1->num!=0)
  111.    {
  112.       n=n+1;
  113.       if(n==1)head=p1;
  114.           else p2->next=p1;
  115.           p2=p1;
  116.           p1=(struct student *)malloc(LEN);

  117.           fscanf(fp,"%ld,%f",&p1->num,&p1->score);
  118.    }
  119.     p2->next=NULL;
  120.         fclose(fp);//关闭文件
  121.         return(head);

  122. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入42汤圆

发表于 2014-5-18 14:18:55 | 显示全部楼层
可能遇到新行问题了, fscanf格式化串第一个字符前加空格试试看.
程序很粗暴啊

出0入0汤圆

 楼主| 发表于 2014-5-18 14:23:25 | 显示全部楼层
albert_w 发表于 2014-5-18 14:18
可能遇到新行问题了, fscanf格式化串第一个字符前加空格试试看.
程序很粗暴啊 ...

高手的ID很熟啊, 我试试

出0入0汤圆

 楼主| 发表于 2014-5-18 14:24:41 | 显示全部楼层
磊磊映画 发表于 2014-5-18 14:23
高手的ID很熟啊, 我试试

不行,停止运行了  

出0入42汤圆

发表于 2014-5-18 14:32:12 | 显示全部楼层
那就用fgets一行一行取出来玩儿吧...
还在哪里见这id?

出0入0汤圆

 楼主| 发表于 2014-5-18 15:01:26 | 显示全部楼层
顶一下,调试不能通过  fputc  fread 用过也

出0入0汤圆

发表于 2014-5-18 16:48:48 | 显示全部楼层
告诉你个大招:单步调试

出0入0汤圆

发表于 2014-5-18 17:30:25 来自手机 | 显示全部楼层
都用电脑做程序了还用链表啊,直接数据库啊,小型的sqlite也可以

出0入0汤圆

发表于 2014-5-18 21:15:26 | 显示全部楼层
mhw 发表于 2014-5-18 16:48
告诉你个大招:单步调试

我也有个大招:设断点!

出0入0汤圆

 楼主| 发表于 2014-5-19 16:18:04 | 显示全部楼层
3050311118 发表于 2014-5-18 17:30
都用电脑做程序了还用链表啊,直接数据库啊,小型的sqlite也可以

小弟是搞单片机的 学C语言是给单片机用,所以学链表了

出0入0汤圆

 楼主| 发表于 2014-5-19 16:18:38 | 显示全部楼层
wangpengcheng 发表于 2014-5-18 21:15
我也有个大招:设断点!

好的  明白了 VC6.0++跟MDK差不多

出0入0汤圆

发表于 2014-5-19 18:12:46 | 显示全部楼层
磊磊映画 发表于 2014-5-19 16:18
好的  明白了 VC6.0++跟MDK差不多

调试的方法都差不多,呵呵!其实我发现RTT里面的链表很好用的,好像在一个K什么的.h文件中,你找找!

出0入93汤圆

发表于 2014-5-19 20:25:37 | 显示全部楼层
fprintf、fscanf第二个参数要加上\n。比如这样:fprintf(fp,"%ld,%f\n",p->num,p->score);     fscanf(fp,"%ld,%f\n",&p1->num,&p1->score);

出0入0汤圆

发表于 2014-5-19 20:46:56 | 显示全部楼层
磊磊映画 发表于 2014-5-19 16:18
小弟是搞单片机的 学C语言是给单片机用,所以学链表了

SQLITE比较简单的  你自个可以百度下查查     与其花这么大力气搞链表 啥的存储数据   还不如用那个 以后记录查询等操作相当省事
我也是搞单片机开始的    现在搞的偏上了 有好用的东西可以用  你干么费那么大力气呢

出0入0汤圆

 楼主| 发表于 2014-5-20 08:01:00 | 显示全部楼层
takashiki 发表于 2014-5-19 20:25
fprintf、fscanf第二个参数要加上\n。比如这样:fprintf(fp,"%ld,%f\n",p->num,p->score);     fscanf(fp," ...

大神级别的回复 谢谢

出0入0汤圆

发表于 2014-5-20 09:24:03 | 显示全部楼层
create
   

出0入0汤圆

 楼主| 发表于 2014-5-21 17:23:19 | 显示全部楼层

什么意思?

出0入0汤圆

发表于 2014-5-21 17:23:58 | 显示全部楼层

拼錯。

出0入0汤圆

 楼主| 发表于 2014-5-21 21:10:02 | 显示全部楼层

还是不懂

出0入0汤圆

发表于 2014-5-21 21:38:43 | 显示全部楼层

沒事了。打擾。

出0入0汤圆

 楼主| 发表于 2014-5-22 16:34:27 | 显示全部楼层
qlb1234 发表于 2014-5-21 21:38
沒事了。打擾。

同样感谢你

出0入0汤圆

 楼主| 发表于 2014-5-23 17:05:23 | 显示全部楼层
本帖最后由 磊磊映画 于 2014-5-23 17:07 编辑

我是来结贴的。
1.在百度找不到答案,百度上的代码说是链表,但大部分是结构体数组2.论坛提问没有针对性解答的情况下3.我决定自己来,经过不断地调试,纠结几天之后,终于解决了问题。
问题的原因是:
1.链表之前存入到文件中的每一字节数据没有标记符号,所以之后读取时就找不到数据了没有开始和结束标记
2.把文件的数据读入到链表中,是通过判断是否是文件结尾结束链表增长的。feof()函数
3.以前数据是按如下格式写入文本中的,data代表数据
data1,data2data3,data4data5,data6.........
现在数据是按这种格式写入到文本中的
data1,data2,data3,data4,data5,data6........
通过对比就知道以前在程序中根本就区别不出“data2跟data3”位置上的数据。
按照新的格式写入和读取就成功了。
贴上最新成功的代码:
  1. /*
  2.    function:将生成结构体中的数据保存到文件中
  3.    time:2014-5-16 9:42:49
  4.    author:zhanglei
  5.    version:V1.0
  6.    input:要存入链表的首地址
  7.    output:void
  8.    链表默认保存到student.txt文件中
  9. */
  10. void store(struct student *head)
  11. {
  12.     FILE *fp;
  13.         struct student *p;
  14.         fp=fopen("student.txt","w+");//新建文件
  15.         if(fp==NULL)
  16.         {
  17.       printf("open file failed");
  18.           exit(0);
  19.         }
  20.         p=head;
  21.     if(head!=NULL)
  22.         {
  23.                 do
  24.                 {
  25.           fprintf(fp,"num is %ld,score is %f,",p->num,p->score);
  26.                   p=p->next;
  27.                 }
  28.         while(p!=NULL);
  29.         }

  30.         fclose(fp);//关闭文件
  31.         printf("Linked list store is ok!\n");
  32.        
  33. }


  34. /*
  35.   function:将文件中的数据读入到链表中
  36.   author:zhanglei
  37.   time:2014-5-16 10:12:23
  38.   version:V1.0
  39.   input:void
  40.   ouput:返回链表的头指针
  41.   读取默认文件 student.txt
  42. */
  43. struct student *load(void)
  44. {
  45.    FILE *fp;
  46.    struct student *head;
  47.    struct student *p1,*p2;
  48.    p1=p2=NULL;
  49.    n=0;
  50.    p1=p2=(struct student *)malloc(LEN);//ERROR
  51.    fp=fopen("student.txt","r+");//打开文件
  52.    rewind(fp);
  53.    if(fp==NULL)
  54.         {
  55.       printf("open file failed");
  56.           exit(0);
  57.         }
  58.   
  59.    
  60.    fscanf(fp,"num is %ld,score is %f,",&p1->num,&p1->score);
  61.    head=NULL;
  62.    while(!feof(fp))
  63.    {
  64.       n=n+1;
  65.       if(n==1)head=p1;
  66.           else p2->next=p1;
  67.           p2=p1;
  68.           p1=(struct student *)malloc(LEN);

  69.           fscanf(fp,"num is %ld,score is %f,",&p1->num,&p1->score);
  70.    }
  71.     p2->next=NULL;
  72.         fclose(fp);//关闭文件
  73.         return(head);

  74. }
复制代码
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 22:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表