ET_Rainman 2020-01-06 00:52 采纳率: 100%
浏览 307
已采纳

文件读写失败,求问哪里出了错?

(学生成绩管理系统链表版)应该是文件读写的问题,第一次录入信息可以写入文件,但再次运行时无法读取之前写入的文件,
且会弹出“Debug error”的框,求问哪里出错了,谢谢

图片说明

点击忽略以后不影响程序运行

图片说明

可以输入信息,且写入了文件

图片说明

但关闭文件后,再次运行程序,显示如下

图片说明

图片说明

无法读取之前写入的信息,程序也无法

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

    //创建学生信息结构体
struct student 
{
    char ID[20];         //学号
    char name[20];       //姓名
    int math;            //高数成绩
    int english;         //英语成绩
    int eletric;         //电路成绩
    int c_program;       //C语言成绩
    float sum;           //总分
    float aver;          //平均分
};

    //链式管理系统
struct Node
{
    struct student data;
    struct Node* next;
};

//创建表头,表示整个链表
struct Node* CreateList()
{
    struct Node* head = (struct Node*)malloc(sizeof(struct Node));
    head->next = NULL;
    return head;  
}

    //创建结点
struct Node* CreateNode(struct student data)
{
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

//插入操作
void insertNode(struct Node* head, struct student data)
{
    //创建插入结点
    struct Node* newNode = CreateNode(data);
    newNode->next = head->next;
    head->next = newNode;
}

    //删除操作
void deleteNode(struct Node* head, char *pID)
{
    struct Node* cur, * prev;
    for (cur = head, prev = NULL;cur != NULL && strcmp(cur->data.ID, pID) != 0;prev = cur, cur = cur->next);
    if (cur == NULL)
    {
       printf("未找到相关数据\n");
       system("pause");
       return;
   }
    if (prev == NULL)
      head = head->next;
        else
      prev->next = cur->next;
    free(cur);
    return;   
    }

    //打印操作
    void printList(struct Node* head)
    {
    //从第二个结点开始打印
    struct Node* p = head->next;
    printf("学号\t姓名\t高数\t英语\t电路\tC语言\t总分\t平均分\n");
    while (p)
    {
    printf("%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n",p->data.ID, p->data.name, p->data.math, p->data.english, p->data.eletric, p->data.c_program, p->data.sum, p->data.aver);
    p = p->next;
    }
    printf("\n");
    }

    //按照平均分进行排序(冒泡排序法)
    void sort(struct Node* head)
    {
    struct Node* p, * pstart, * pend, * temp, * pre;
    p = head->next;    pend = head;                     
  pstart = (struct Node*)malloc(sizeof(struct Node));     
  pstart->next = head;                                   
    while (p != NULL)
    {
    temp = pstart->next, pre = pstart;                      
    while (temp != p && p->data.aver >= temp->data.aver)    
    {                                                       
        temp = temp->next;
        pre = pre->next;
    }
    if (temp == p)                                          
        pend = p;
    else                                                    
    {
        pend->next = p->next;                              
        p->next = temp;                                     
        pre->next = p;                                      
    }
    p = pend->next;
    }
    head = pstart->next;
    free(pstart);
    return;
    }

    //链表的文件操作
    //链表的读文件操作
    void readInfo(struct Node* head, char* fileName)
    {
    FILE* read = fopen(fileName, "r");
    if (read == NULL)
    read = fopen(fileName, "w+");
    struct student data;
    while (fscanf(read, "%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n",
    data.ID, data.name, data.math, data.english, data.eletric, data.c_program, data.sum, data.aver) != EOF)
    insertNode(head, data);
    fclose(read);
    }

    //链表的写文件操作
    void writeInfo(struct Node* head, char *fileName)
    {
    FILE* write = fopen(fileName, "w");
    struct Node* p = head->next;
    while (p)
    {
    fprintf(write, "%s\t%s\t%d\t%d\t%d\t%d\t%3.0f\t%.2f\n",
    p->data.ID, p->data.name, p->data.math, p->data.english, p->data.eletric, p->data.c_program, p->data.sum, p->data.aver);
    p = p->next;
    }
    fclose(write);
    }

    //菜单项目
    void menu()
    {
    printf("--------------学生成绩管理系统------------------\n");
  printf("\t\t0.退出系统\n");
  printf("\t\t1.录入信息\n");
  printf("\t\t2.浏览信息\n");
  printf("\t\t3.删除信息\n");
  printf("\t\t4.修改信息\n");
  printf("\t\t5.成绩排序\n");
  printf("------------------------------------------------\n");
    }

    struct Node* studentList = CreateList();

    //按键交互
    void keydown()
    {
    int userkey = 0;
  printf("请输入指令的相应序号:\n");
  scanf("%d", &userkey);
  struct student userData;
  switch (userkey)
  {
  case 0: 
      printf("--------------【退出系统】---------------\n"); 
      printf("正常退出\n");
      system("pause");
      exit(0);
      break;
  case 1: 
      printf("--------------【录入信息】---------------\n");
      printf("请输入以下学生信息:\n");
      printf("学号\t姓名\t高数\t英语\t电路\tC语言\n");
      scanf("%s%s%d%d%d%d", userData.ID, userData.name, &userData.math, &userData.english, &userData.eletric, &userData.c_program);
      userData.sum = userData.math + userData.eletric + userData.c_program + userData.english;
      userData.aver = (userData.sum) / 4;
      insertNode(studentList, userData);
      break;
  case 2: 
      printf("--------------【浏览信息】---------------\n");
      printList(studentList);
      break;
  case 3: 
      printf("--------------【删除信息】---------------\n");
      printf("请输入需要删除的学生学号:\n");
      scanf("%s", userData.ID);
      deleteNode(studentList, userData.ID);
      break;
  case 4: 
      printf("--------------【修改信息】---------------\n");
      printf("请输入需要修改的学生学号:\n");
      scanf("%s", userData.ID);
    deleteNode(studentList, userData.ID);
      printf("请重新输入以下学生信息:\n");
      printf("学号\t姓名\t高数\t英语\t电路\tC语言\n");
      scanf("%s%s%d%d%d%d", userData.ID, userData.name, &userData.math, &userData.english, &userData.eletric, &userData.c_program);
      userData.sum = userData.math + userData.eletric + userData.c_program + userData.english;
      userData.aver = (userData.sum) / 4;
      insertNode(studentList, userData);
      printf("修改成功!\n");
      break;
  case 5: 
      printf("--------------【成绩排序】---------------\n");
      sort(studentList);
      printList(studentList);
      break;
  default:printf("输入错误,请重新输入\n");
      break;
        }
        }

        int main()
        {
        readInfo(studentList, "studentInfo.txt"); 
    while (1)
        {
        menu();
      keydown();
      writeInfo(studentList, "studentInfo.txt");
      system("pause");
      system("cls");
        }
        system("pause");
        return 0;
        }

图片说明
图片说明
图片说明
图片说明

  • 写回答

3条回答 默认 最新

  • 周祭酒 2020-01-06 08:56
    关注

    c++我不懂,从报错来看 data变量没有初始化,那就是 struct student data 部分没有初始化好,以前这样写好像是没错,不知道现在的c标准做了什么规定

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥30 用arduino开发esp32控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿