LIUCON66666 2021-11-20 16:23 采纳率: 0%
浏览 30

为什么文件读入不全还是其他?不太懂

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图

#include <stdio.h> //标准输入输出函数库 
#include <time.h> //用于获得随机数
#include <windows.h> //控制dos界面 
#include <stdlib.h> //即standard library标志库头文件,里面定义了一些宏和通用工具函数 
#include <string.h> 

#define CNO 4 //选项数量 
#define swap(type,x,y) do {type t = x;x = y;y = t; }while(0)

void endgame(); //结束练习函数

void File_in(); //存储最高分文件
void File_out(); //读取文件最高分
void choose(); //分支选择函数
void Lost(); //结果界面
void rule(); //计分规则函数
int read(); //读取单词文件函数



int color(int c); //设置颜色函数
void gotoxy(int x,int y); //设置光标函数
void start(); //开始界面函数







/*
void run(); //判断选择题结果函数

int make(int c[],int n);//生成选项并返回正确的下标 

void print(const int c[],int sw); //显示选项
*/



int score = 0; //分数
int HighScore = 0; //最高分数
int QNO; //单词数量 
char **cptr; //指向中文单词的指针数组 
char **eptr; //指向英语单词的指针数组 



/*文字颜色函数*/
int color (int c)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);//更改文字颜色
    return 0; 
 } 
 
 /*设置光标位置*/
 void gotoxy(int x,int y)
 {
     COORD c;
     c.X = x;
     c.Y = y;
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
  }  
  
  /*开始界面*/ 
  void start() 
  {
      int n;
      int i,j = 1;
      gotoxy(20,2);
      color(14);
      printf("英 语 单 词 巩 固 练 习");
    color(10);
    for(i = 6;i <= 12;i++)            //输入上下边框 
    {
        for(j = 7;j <=54;j++)        //输出左右边框☆ 
        {
            gotoxy(j,i);
            if(i == 6 || i ==12)
            {
                printf("*");
            }
            else if(j == 7 || j == 54)
            {
                printf("☆"); 
            }
        }
     } 
     color(13);
     gotoxy(15,8);
     printf("1.开始练习");
     gotoxy(35,8);
     printf("2.积分规则"); 
     gotoxy(15,10);
     printf("3.退出练习");
     gotoxy(22,13);
     color(12);
     printf("请选择[1 2 3]:[ ]\b\b");//\b为退格,使得光标处于[]中间 
     color(15);
     scanf("%d",&n);                 //输入选项
     switch(n)
     {
         case 1:
             system("cls");
             run();                    //添加新的代码 
             break;
         case 2:
             rule();                    //积分规则函数 
             break;
         case 3:
             exit(0);                //退出游戏 
             break;
         default:                    //输入非1~3的选项 
             color(12);
             gotoxy(40,28);
            printf("请输入1~3的数!");
            getch();                //输入任意键
            system("cls");            //清屏
            start(); 
      } 
     
  }
  /*积分规则*/
  void rule()
  {
      int i,j = 1;
      system("cls");
      color(12);
      gotoxy(44,3);
      printf("积分规则");
      color(5);
      for(i = 6;i <= 22;i++)        //输出上下边框 
      {
          for(j = 20;j <=75;j++)    //输出左右边框 
          {
              gotoxy(j,i);
              if(i ==6 || i == 22)printf("*");
              else if(j == 20 || j ==75)printf("*"); 
           } 
      }
     color(13);
     gotoxy(30,8);
     printf("规则1:从4个选项里选择对应的词义");
     color(10);
     gotoxy(30,11);
     printf("规则2:回答正确加10分"); 
     color(14);
     gotoxy(30,14);
     printf("规则3:回答错误减掉10分");
     color(11); 
     gotoxy(30,17);
     printf("规则4:Esc退出练习"); 
     getch();                //按任意键返回主界面
     system("cls");
     start(); 
   } 
   
   /*读取单词*/
   int read()
   {
       int i;
       FILE *fp;                //定义文件指针 
       char filename[30];
       color(12);
       printf("请输入单词的存储文件名:\n");
       color(15);
       scanf("%s",filename);
       if((fp = fopen(filename,"r")) == NULL)
           return 1;
       fscanf(fp, "%d" ,&QNO);    //读取单词的数量
    if((cptr = calloc(QNO,sizeof(char *))) == NULL) return 1;
    if((eptr = calloc(QNO,sizeof(char *))) == NULL) return 1;
    
    for(i = 0;i < QNO ;i++){
        char etemp[1024];
        char ctemp[1024];
        fscanf(fp, "%s%s" ,etemp,ctemp);
        if((eptr[i] = malloc(strlen(etemp) + 1)) == NULL) return 1;
        if((cptr[i] = malloc(strlen(ctemp) + 1)) == NULL) return 1;
        strcpy(eptr[i], etemp);
        strcpy(cptr[i], ctemp); 
    
        }
        fclose(fp);
        return 0;
    } 
    /*存储最高分文件*/
    void File_in()
    {
        FILE *fp;
        fp = fopen("save.txt","w+");    //以读写的方式建立一个名为save.txt的文件
        fprintf(fp, "%d",score);        //把分数写进文件 
        fclose(fp);                     //关闭文件 
     } 
     /*在文件中读取最高分*/
     void File_out()
     {
         FILE *fp;
         fp = fopen("save.txt","a+");    //打开文件save.txt 
         fscanf(fp, "%d",&HighScore);    //把文件中的最高分读出来 
         fclose(fp);                        //关闭文件 
      }  
      
      /*显示选项*/
       void pritf(const int c[],int sw)
       {
           int i;
           color(14);
           for(i = 0; i < CNO;i++)
               printf("(%d) %s  ", i, sw ? cptr[c[i]] : eptr[c[i]]);
           printf(": ");
        }
      
      /*生成选项并返回正确的下标*/
      int make(int c[],int n)
      {
          int i,j,x;
          
          c[0] = n;                    //在开头元素中存入正确的答案
          
        for(i = 1;i < CNO;i++) {
            do{                        //生成不重复的随机数 
                x = rand() % QNO;
                for(j = 0;j < i;j++)
                if(c[j] == x)        //已经生成了相同的随机数
                    break; 
            }while(i != j);
            c[i] = x;
        }
        j = rand() % CNO;
        if(j != 0)
            swap(int,c[0],c[j]);    //移动正确答案
            return j; 
       } 
           
        /*判断选择结果*/
        int run()
        {
            int i;
            int nq,pq;                //题目编号和上一次的题目编号 
            int na;                    //正确答案的编号 
            int sw;                    //题目语言(0:中文/1:英文) 
            int retry;                //重新挑战吗? 
            int cand[CNO];            //选项的编号
            
            if(read() == 1)
            {
                printf("\a单词文件读取失败。\n");
                return 1;
             } 
             srand(time(NULL));        //设定随机数的种子    
                 
             pq = QNO;                //上一次的题目编号(不存在的编号)
                 
             do{
                 int no;
                 
                 do{                    //决定用于出题的单词的编号 
                     nq = rand() % QNO;
                 }while(nq==pq);    //不连续出同一个单词
                 
                 na = make(cand,nq);//生成选项 
                 sw = rand() % 2; 
                 color(11);
                 printf("哪一个是%s?\n",sw ? eptr[nq] : cptr[nq]);
                 
                 do{
                     printf(cand, sw);//显示选项
                    scanf("%d",&no);
                    if(no != na)
                    {
                        color(15);
                        puts("对不起,您的回答错误,减掉10分");
                        score -= 10;
                     } 
                 }while(no != na);
                 color(13);
                 puts("您的回答正确,恭喜加10分");
                 score += 10;
                 pq = nq;
                 color(10);
                 printf("再来一次?0-否/1-是:");
                 scanf("%d",&retry);          
             }while(retry == 1);
             
             for(i = 0;i < QNO;i++)
             {
                 free(eptr[i]);
                 free(cptr[i]);
             }
             free(cptr);
             free(eptr);
             File_out();
            // endgame();
             exit(0);
             return 0;
         } 
  
  int main()
  {
      start(); 
      run();
      return 0; 
  }
运行结果及报错内容

img

img

img

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2021-11-20 16:40
    关注

    你的文件读取成功了吗?文件是不是在你的工程目录下呢?

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 11月20日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境