m0_53982053
他心丶
2021-03-08 22:08

求助为什么我写进去的问题不能保存在文件里?

#include  <stdio.h>  
 #include  <stdlib.h>  
 #include  <time.h>  
 #define TEST struct test  
 #define SIZE sizeof(struct test)  
  
 struct test  
 {  
 char main[1000];  
 char answer[4][80];  
 int rightanswer;  
 struct test *next;  
 };  
  
 int menu();//选择菜单  
 TEST *print(TEST *head,const TEST *p);//将文件中题目输出  
 TEST *taketest(TEST *test,int size);//随机选择题目  
 void addtest(TEST *test);//向题库中添加题目  
 void save(const TEST *head,FILE *fp);//将获取的题目保存到文件  
 TEST *load(TEST *head,FILE *fp);//读取文件  
 int myanswer();//用户输入答案  
 void answer(const TEST *head,int n);//用户答题  
  
  
 main()  
 {  
  TEST *head=NULL,temp;  
  int choice,len=0,c;  
  FILE *fp=fopen("test.dat","a");  
  head=load(head,fp);  
  while((choice=menu())!=3)  
  if(choice==1)  
  {  
  addtest(&temp);  
  head=print(head,&temp);  
  ++len;  
  }  
  else if(choice==2)  
  {  
  c=600;  
  while(c>500 ||c>len)  
  {  
  printf("请输入要回答的题的数量:");  
  scanf("%d",&c);  
  taketest(head,c);  
  }  
  }  
  save(head,fp);  
  fclose(fp);  
  return 0;  
 }  
  
 TEST *taketest(TEST *test,int size)//从文件中随机抽取题目  
 {  
  int i;  
  int seed=1000; // 种子  
  int m[16];  
  int nn=1;  
  double r;  
  
  srand(seed); // 初始化随机数生成器  
  for (i=0;i  <size;i++)  
  m[i]=0;  
  while(nn  <10)// r 是双精度浮点随机数,范围0.0到1.0  
  {  
  r=((double)rand()/((double)(RAND_MAX)+(double)(1)));  
  i=(int)(r*size);  
  if(m[i]==0)  
  {  
  m[i]=1;  
  nn=nn+1;  
  }  
  test->next=test;  
  answer(test,size);  
  
  }  
  return test; 
  
 }  
 void answer(const TEST *head,int n)  
 {  
  int i=0,t=n;  
  char result[1001],*p=result;  
  for(i=0;n--;head=head->next)  
  {  
  printf("%s\nA.%s\nB.%s\nC.%s\nD.%s\n\n",head->main,head->answer[0],head->answer[1],head->answer[2],head->answer[3]);  
  if((*p=head->rightanswer)==(*(p+1)=myanswer()))  
  ++i;  
  p+=2;  
  }  
  *p='\0';  
  printf("\n%-13s%-13s%s\n", "标准答案", "您的答案", "评价");  
  for(p=result;*p!='\0';p+=2)   
  printf("%-13c%-13c%s\n",*p,*(p+1),*p==*(p+1)?"正确":"错误");  
  printf("\n您回答了%d道题, 答对%d道题目,得分:%.2f\n\n",t,i,(float)i/t*100.00);  
 }  
  
 TEST *print(TEST *head,const TEST *p)  
 {  
  TEST *p1=(TEST *)malloc(SIZE);  
  if(p1==NULL)  
  exit(0);  
  *p1=*p;  
  p1->next=head;  
  return p1;  
 }  
  
  
 void addtest(TEST *test)  
 {  
  int i=0;  
  printf("输入题干:\n");  
  scanf("%s",test->main);  
  while(i  <4)  
  {  
  printf("请输入选项%c的答案:\n",i+'A');  
  scanf("%s",test->answer[i++]);  
  fflush(stdin); 
  }  
  test->rightanswer=myanswer();  
 }  
  
 TEST *load(TEST *head,FILE *fp)  
 {  
  TEST temp;  
  while(fread(&temp,SIZE,1,fp))  
  head=print(head,&temp);  
  return head;  
 }  
  
 void save(const TEST *head,FILE *fp)  
 {  
  fclose(fp);  
  if((fp=fopen("test.dat","w"))==NULL)  
  return;  
  while(head)  
  {  
  fwrite(head,SIZE,1,fp);  
         head=head->next;  
  }  
 }  
  
  
 int myanswer()  
 {  
  char c='a'; // here 
  fflush(stdin);  
  if((c>='A'&&c  <='D') ||(c>='a'&&c  <='d'))  // here 
  {  
  printf("请输入A、B、C、D或a、b、c、d:");  
  scanf("%c",&c);  
  }  
  return c;  
 }  
  
  
 int menu()  
 {  
  int value;  
  printf("1 - 添加选择题\n2 - 回答选择题\n3 - 退出\n");  
  scanf("%d",&value);  
  return value;  
 }

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答