鱼C论坛

 找回密码
 立即注册
查看: 1607|回复: 3

文件不能fread

[复制链接]
发表于 2015-12-26 09:24:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 DarkSE 于 2015-12-26 09:26 编辑

第一个从文件录入信息出错,我自己弄了一下好像指针pr没有问题,那应该是文件fp出现问题吧,fp的内容是一开始用wb的形式录入,成功了再用ab形式的。麻烦各位帮我看一下,谢谢。
问题在第142和143行

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. struct link *input(struct link *head);
  5. struct link *course_enroll();//课程录入//完成
  6. struct link *student_enroll();//学生录入//未完成
  7. void course_skim();//课程信息浏览//完成
  8. int check();//学分查询
  9. void event();//课程选修情况//完成
  10. void check_number();//学号查询//完成
  11. void deletememory();//清除内存
  12. struct student
  13. {
  14.         int stu_number;
  15.         char stu_name[10];
  16.         int select_number;
  17.         struct student *stu_next;
  18. }student1;
  19. struct link
  20. {
  21.         int number;//课程编号
  22.         char name[10];
  23.         char nature[10];//课程性质
  24.         int time;//总学时
  25.         int time_class;//授课时间
  26.         int score;
  27.         int time_start;//开课时间
  28.         struct student *stu;
  29.         struct link *next;//节点
  30. };

  31. main()
  32. {
  33.         int n,a=0;
  34.         struct link *head=NULL;
  35.         struct student *stu_head=NULL;
  36.         for(;;)
  37.         {
  38.         do
  39.         {
  40.                 system("cls");
  41.                 printf("\n\n\t\t  ----------欢迎进入学生选课系统----------\n\n");
  42.                 printf("\t\t            1->课程信息录入系统          \n\t\t            2->学生选课信息录入系统          \n");
  43.                 printf("\t\t            3->课程信息浏览          \n\t\t            4->学分查询\n");
  44.                 printf("\t\t            5->课程选修情况          \n\t\t            6->学号查询功能\n\t\t            7->退出选课系统          \n");
  45.                 printf("\n\t\t  ----------------------------------------");
  46.                 printf("\t\t             请输入:");
  47.                 scanf("%d",&n);
  48.                 if(n<0 || n>=8)
  49.                 {
  50.                         printf("     输入错误,请重新输入:");
  51.                 }
  52.                 Sleep (500);
  53.         }while(n<0 || n>=8);
  54.                 switch(n)
  55.                 {
  56.                 case 0:
  57.                         {
  58.                                 system("cls");
  59.                                 head=input(head);
  60.                                 break;
  61.                         }
  62.                         case 1:
  63.                         {
  64.                                 system("cls");
  65.                                 head=(course_enroll(head));
  66.                                 break;
  67.                         }
  68.                         case 2:
  69.                         {
  70.                                 system("cls");
  71.                                 stu_head =student_enroll(head,stu_head);
  72.                                 break;
  73.                         }
  74.                         case 3:
  75.                         {
  76.                                 system("cls");
  77.                                 course_skim(head);
  78.                                 break;
  79.                         }
  80.                         case 4:
  81.                         {
  82.                                 system("cls");
  83.                                 check(head,stu_head);
  84.                                 break;
  85.                         }
  86.                         case 5:
  87.                         {
  88.                                 system("cls");
  89.                                 event(head,stu_head);
  90.                                 break;
  91.                         }
  92.                         case 6:
  93.                         {
  94.                                 system("cls");
  95.                                 check_number(head,stu_head);
  96.                                 break;
  97.                         }
  98.                         case 7:
  99.                         {
  100.                                 deletememory(head,stu_head);
  101.                                 exit(0);       
  102.                         }
  103.                 }
  104.         }
  105. }
  106. //文件导入信息
  107. struct link *input(struct link *head)
  108. {
  109.         struct link *p=NULL;//定义指针p
  110.         struct link *pr=head;//定义指针pr指向head
  111.         FILE *fp;//文件
  112.         if(!(fp = ("随意修改","rb")))
  113.         {
  114.                 printf("不能打开文件!\n");
  115.                 return;
  116.         }
  117. //        rewind(fp);
  118.         while(!feof(fp))
  119.         {
  120.                 p = (struct link *)malloc(sizeof(struct link));//动态申请内存
  121.                 if(p == NULL)
  122.                 {
  123.                         printf("内存不足!\n");
  124.                         exit(1);
  125.                 }
  126.                 if(head == NULL)//head为空
  127.                 {
  128.                         head = p;
  129.                 }
  130.                 else
  131.                 {
  132.                         while(pr->next != NULL)
  133.                         {
  134.                                 pr = pr->next;
  135.                         }
  136.                         pr->next = p;
  137.                 }
  138.                 pr = p;
  139.         //        printf("%d",pr);指针地址存在,pr不存在问题
  140.         //        fread(pr,sizeof(struct link),1,fp);
  141.                 fscanf(fp,"%d%s%s%d%d%d%d",&pr->number,&pr->name,&pr->nature,&pr->time,&pr->time_class,&pr->score,&pr->time_start);
  142.         /*        if(fread(pr,sizeof(struct link),1,fp))
  143.                 {
  144.                         printf("输出错误!\n");
  145.                         fclose(fp);
  146.                 }*/
  147.                 pr->next = NULL;
  148.         }
  149.         fclose(fp);
  150.         return head;       
  151. }
  152. struct link *course_enroll(struct link *head)//课程录入
  153. {
  154.         int j=1,flag=1,i;
  155.         FILE *fp;
  156.         struct link *p=NULL;
  157.         struct link *pr=head;//指针指向head
  158.         if(!(fp = fopen("随意修改","ab")))
  159.         {
  160.                 printf("不能打开文件!\n");
  161.                 return;
  162.         }
  163.         printf("\n\n\t\t----------欢迎进入课程信息录入系统:----------\n");
  164.         while(flag == 1)
  165.         {
  166.         printf("\n\n\t\t          请输入录入的课程的门数:");
  167.         scanf("%d",&i);
  168.         j=1;
  169.         system("cls");//清屏
  170.         printf("请按照以下格式输入课程信息:\n");
  171.         printf("---编号--名称--性质--学时--授课时间--学分--开课学期---\n");
  172.         for(j;j<=i;j++)//输入的课程的数目
  173.         {
  174.                 p=(struct link *)malloc(sizeof(struct link));//为struct link申请内存
  175.                 if(p==NULL)//检查申请内存是否为空
  176.                 {
  177.                         printf("系统错误!!");
  178.                         exit(0);
  179.                 }
  180.                 if(head==NULL)//检查head是否为空
  181.                 {
  182.                         head=p;//head为空,把第一个当做第一个链表
  183.                 }
  184.                 else//head 不为空
  185.                 {
  186.                         while (pr->next != NULL)//指向下一个,直到链尾为止
  187.                         {
  188.                                 pr=pr->next;
  189.                         }
  190.                         pr->next=p;//把申请的内存接在链尾后面
  191.                 }
  192.                 pr=p;//把空链表指向head
  193.                 scanf("%d",&pr->number);
  194.                 scanf("%s",&pr->name);
  195.                 scanf("%s",&pr->nature);
  196.                 scanf("%d",&pr->time);
  197.                 scanf("%d",&pr->time_class);
  198.                 scanf("%d",&pr->score);
  199.                 scanf("%d",&pr->time_start);
  200.                 fwrite(pr,sizeof(struct link),1,fp);
  201.                 pr->next=NULL;//最后一个的指针域定义为NULL
  202.         }
  203.         printf("-----------------------------------------------------------");
  204.         printf("\n\n是否退出课程信息录入系统?退出输入0,不退出输入1!\n请输入:");
  205.         scanf("%d",&flag);
  206.         do
  207.         {
  208.         if(flag<0 || flag>1)
  209.         {
  210.                 printf("输入错误!! 请重新输入:");
  211.                 scanf("%d",&flag);
  212.         }
  213.         }while(flag <0 || flag > 1);
  214.         p=head;
  215.         }
  216.         fclose(fp);
  217.         return head;
  218. }
  219. struct link *student_enroll(struct link *head,struct student *stu_head)//学生录入//学生选择课程的编号进而录入
  220. {
  221.         int number,flag=1;
  222.         FILE *fp1;
  223.         struct student *pstu=NULL;
  224.         struct student *pstur=stu_head;
  225.         struct link *p=head;
  226.         if(!(fp1 = fopen("学生信息","ab")))
  227.         {
  228.                 printf("不能打开文件!\n");
  229.                 return;
  230.         }
  231.         printf("\n\n\t\t----------欢迎进入学生选课信息录入系统:----------\n");
  232.         Sleep(1000);
  233.         while(flag == 1)
  234.         {
  235.         system("cls");//清屏
  236.         if(p==NULL)//head是否为空
  237.         {
  238.                 printf("系统未录入任何信息 !!\n");//没有数据可供选课
  239.         }
  240.         else
  241.         {
  242.                 printf("请输入选择的课程编号:");
  243.                 scanf("%d",&number);
  244.                 while(p!=NULL)//
  245.                 {
  246.                         if( number == p->number )//寻找存在的课程编号
  247.                         {
  248.                                 printf("请输入学生学号及姓名:");
  249.                                  pstu = (struct student *)malloc(sizeof(struct student));
  250.                                 if(pstu == NULL)//申请内存为空
  251.                                 {
  252.                                         printf("系统错误!!");
  253.                                         exit(0);
  254.                                 }
  255.                                 if(stu_head==NULL)//stu_head为空
  256.                                 {
  257.                                         stu_head=pstu;
  258.                                 }
  259.                                 else
  260.                                 {
  261.                                         while(pstur->stu_next != NULL)//stu_head不为空,寻找到链尾为止
  262.                                         {
  263.                                                 pstur=pstur->stu_next ;
  264.                                         }
  265.                                         pstur->stu_next = pstu;//申请的内存加入链尾
  266.                                 }
  267.                                 pstur=pstu;
  268.                                 scanf("%d",&pstu->stu_number);
  269.                                 scanf("%s",&pstu->stu_name);
  270.                                 pstu->select_number = number;
  271.                                 pstu->stu_next=NULL;//新节点指针域定义为NULL
  272.                         //        p->stu = stu_head;
  273.                                 fwrite(pstu,sizeof(struct link),1,fp1);
  274.                                 break;
  275.                         }
  276.                         p=p->next ;//当寻找不到符合的课程编号,则指向下一个继续寻找,直到链尾
  277.                 }
  278.         }
  279.         printf("-----------------------------------------------------------");
  280.         printf("\n\n是否退出学生选课信息录入系统?退出输入0,不退出输入1!\n请输入:");
  281.         scanf("%d",&flag);
  282.         do
  283.         {
  284.         if(flag<0 || flag>1)
  285.         {
  286.                 printf("输入错误!! 请重新输入:");
  287.                 scanf("%d",&flag);
  288.         }
  289.         }while(flag <0 || flag > 1);
  290.         p=head;
  291.         }
  292.         fclose(fp1);
  293.         return stu_head;
  294. }
  295. void course_skim(struct link *head)//课程信息浏览
  296. {
  297.         struct link *p=head;
  298.         int flag=1;
  299.         printf("\n\n\t\t----------欢迎进入课程信息浏览系统:----------\n");
  300.         Sleep(1000);
  301.         while(flag == 1)
  302.         {
  303.         system("cls");
  304.         if(p==NULL)
  305.         {
  306.                 printf("系统未录入任何信息 !!\n");
  307.         }
  308.         else
  309.         {
  310.         printf("---编号--名称--性质--学时--授课时间--学分--开课学期---\n");
  311.         while(p != NULL)
  312.         {
  313.                 printf("\n%d   ",p->number);
  314.                 printf("%s   ",p->name);
  315.                 printf("%s   ",p->nature);
  316.                 printf("%d   ",p->time);
  317.                 printf("%d   ",p->time_class);
  318.                 printf("%d   ",p->score);
  319.                 printf("%d   \n",p->time_start);
  320.                 p = p->next;
  321.         }
  322.         }
  323.         printf("-----------------------------------------------------------");
  324.         printf("\n\n是否退出课程信息浏览系统?退出输入0,不退出输入1!\n请输入:");
  325.         scanf("%d",&flag);
  326.         do
  327.         {
  328.         if(flag<0 || flag>1)
  329.         {
  330.                 printf("输入错误!! 请重新输入:");
  331.                 scanf("%d",&flag);
  332.         }
  333.         }while(flag <0 || flag > 1);
  334.         p=head;
  335.         }
  336. }
  337. int check(struct link *head,struct student *stu_head)//学分查询
  338. {
  339.         int number,flag=1;
  340.         struct link *p=head;
  341.         struct student *pr=stu_head;
  342.         printf("\n\n\t\t----------欢迎进入学分查询系统:----------\n");
  343.         Sleep(1000);
  344.         while(flag == 1)
  345.         {
  346.         system("cls");
  347.         if(p==NULL)
  348.         {
  349.                 printf("系统未录入任何信息 !!\n");
  350.         }
  351.         else
  352.         {
  353.                 printf("请输入查询的课程学分:");
  354.                 scanf("%d",&number);//输入查询的学分
  355.                 printf("学分为%d的课程编号、课程名称为:\n",number);
  356.                 while( p != NULL)
  357.                 {
  358.                         if(number == (p->score))//查询的学分与课程学分相同
  359.                         {
  360.                                 printf("\n%d---",p->number);
  361.                                 printf("%s\n",p->name);
  362.                         }
  363.                         p = p->next;//学生信息下移到一个指针
  364.                 }//学生信息查询到结束
  365.         }
  366.         printf("-----------------------------------------------------------");
  367.         printf("\n\n是否退出学分查询入系统?退出输入0,不退出输入1!\n请输入:");
  368.         scanf("%d",&flag);
  369.         do
  370.         {
  371.         if(flag<0 || flag>1)
  372.         {
  373.                 printf("输入错误!! 请重新输入:");
  374.                 scanf("%d",&flag);
  375.         }
  376.         }while(flag <0 || flag > 1);
  377.         p=head;
  378.         }
  379. }
  380. void event(struct link *head,struct student *stu_head)//课程选修情况
  381. {
  382.         struct link *p=head;
  383.         struct student *pr=stu_head;
  384.         struct link *pp=head;
  385.         int flag=1;
  386.         printf("\n\n\t\t----------欢迎进入课程选修查询系统:----------\n");
  387.         Sleep(1000);
  388.         while(flag == 1)
  389.         {
  390.         system("cls");
  391.         if(p==NULL)
  392.         {
  393.                 printf("系统未录入任何信息 !!\n");
  394.         }
  395.         else if(pr == NULL)
  396.         {
  397.                 printf("学生未进行选课\n");
  398.         }
  399.         else
  400.         {
  401.                 //输出课程信息
  402.                 printf("---编号--名称--性质--学时--授课时间--学分--开课学期--学生学号--学生姓名---\n");
  403.                 while(p != NULL )
  404.                 {
  405.                         pr=stu_head;
  406.                         printf("\n%d----",p->number);
  407.                         printf("%s----",p->name);
  408.                         printf("%s----",p->nature);
  409.                         printf("%d----",p->time);
  410.                         printf("%d----",p->time_class);
  411.                         printf("%d----",p->score);
  412.                         printf("%d----",p->time_start);
  413.                         //输出课程里面的学生信息
  414.                         while(pr != NULL)
  415.                         {
  416.                                 if(pr->select_number == p->number)
  417.                                 {
  418.                                         printf("%d----",pr->stu_number);
  419.                                         printf("%s   \n",pr->stu_name);
  420.                                 }
  421.                                 pr = pr->stu_next;
  422.                         }
  423.                         p = p->next;
  424.                 }
  425.         }
  426.         printf("\n-----------------------------------------------------------");
  427.         printf("\n\n是否退出课程选修查询系统?退出输入0,不退出输入1!\n请输入:");
  428.         scanf("%d",&flag);
  429.         do
  430.         {
  431.         if(flag<0 || flag>1)
  432.         {
  433.                 printf("输入错误!! 请重新输入:");
  434.                 scanf("%d",&flag);
  435.         }
  436.         }while(flag <0 || flag > 1);
  437.         p=head;
  438.         pr=stu_head;
  439.         }
  440. }
  441. //学生学号查询学生选课信息
  442. void check_number(struct link *head,struct student *stu_head)//5
  443. {
  444.         int number,flag=1,i=0;
  445.         struct link *p=head;
  446.         struct student *pr=stu_head;
  447.         printf("\n\n\t\t----------欢迎进入学号查询系统:----------\n\n");
  448.         Sleep(1000);
  449.         while(flag == 1)
  450.         {
  451.         system("cls");
  452.         if(p==NULL)
  453.         {
  454.                 printf("系统未录入任何信息 !!\n");
  455.         }
  456.         else if(pr == NULL)
  457.         {
  458.                 printf("未有选课记录!!\n");
  459.         }
  460.         else
  461.         {
  462.                 printf("请输入查询的学生学号:");
  463.                 scanf("%d",&number);//输入查询的学生编号
  464.                 i=0;
  465.                 while( pr != NULL)
  466.                 {
  467.                         if(number == (pr->stu_number))//查询的学号与学生学号相同
  468.                         {
  469.                                 p = head;
  470.                                 //输出选择的课程编号和名字
  471.                                 while(p != NULL)//学生信息里的选课编号等于课程编号
  472.                                 {
  473.                                         if(pr->select_number == p->number)
  474.                                         {
  475.                                                 printf("学生编号:%d\t学生名字:%s\t",pr->stu_number,pr->stu_name);//学生编号和名字
  476.                                                 printf("课程编号:%d\t",p->number);//课程编号
  477.                                                 printf("课程名字:%s   \n",p->name);//课程名字
  478.                                                 i += p->score;
  479.                                         }
  480.                                         p = p->next;
  481.                                 }
  482.                         }
  483.                         pr = pr->stu_next;//学生信息下移到一个指针
  484.                 }//学生信息查询到结束
  485.                 printf("-----------------------------------------------------------");
  486.                 if(i<15)
  487.                 {
  488.                         printf("\n学生编号为:%d,总学分为:%d\n\n警告警告!!总学分低于15分\n",number,i);
  489.                 }
  490.                 else
  491.                 {
  492.                         printf("\n学生编号为:%d,总学分为:%d\n\n",number,i);
  493.                 }
  494.         }
  495.         printf("\n\n是否退出学号查询系统?退出输入0,不退出输入1!\n请输入:");
  496.         scanf("%d",&flag);
  497.         do
  498.         {
  499.         if(flag<0 || flag>1)
  500.         {
  501.                 printf("输入错误!! 请重新输入:");
  502.                 scanf("%d",&flag);
  503.         }
  504.         }while(flag <0 || flag > 1);
  505.         pr=stu_head;
  506.         p=head;
  507.         }
  508. }
  509. //清除分配的内存
  510. void deletememory(struct link *head,struct student *stu_head)
  511. {
  512.         struct link *p=head;
  513.         struct student *pstu=stu_head;
  514.         struct link *pr=NULL;
  515.         system("cls");
  516.         printf("\n\n\t\t\t    ********************\n");
  517.         printf("\t\t\t    *   成功退出系统   *\n");
  518.         printf("\t\t\t    ********************\n\n");
  519.         while(p != NULL)
  520.         {
  521.                 pr=p;
  522.                 p=p->next ;
  523.                 free(pr);
  524.         }
  525.         while(pstu!=NULL)
  526.         {
  527.                 pr=pstu;
  528.                 pstu=pstu->stu_next ;
  529.                 free(pr);
  530.         }
  531.         Sleep(500);
  532. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-12-26 11:50:13 | 显示全部楼层
楼主能不能把那个文件也发一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-27 12:37:33 | 显示全部楼层
黑龍 发表于 2015-12-26 11:50
楼主能不能把那个文件也发一下

我解决了,谢谢,是第113行打少了fopen,而且他没有报错……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-27 12:52:45 | 显示全部楼层
DarkSE 发表于 2015-12-27 12:37
我解决了,谢谢,是第113行打少了fopen,而且他没有报错……

当然不会报错了 不过竟然没有崩溃。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 16:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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