成为最强的理塘丁真 2024-01-07 01:56 采纳率: 45.5%
浏览 4
已结题

怎么样实现从本地文件里读取数据啊一直没有搞对下面是代码


#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
// 定义学生结构体  
typedef struct Student {  
    int id;                  // 编号  
    char name[50];           // 姓名  
    char studentId[20];       // 学号  
    char college[50];         // 学院  
    char className[50];        // 班级  
    char major[50];            // 专业  
    char phone[20];            // 电话  
    int age;                   // 年龄  
    char birthday[20];         // 生日  
    char dormitory[100];       // 宿舍  
    struct Student* next;       // 下一个学生的指针  
} Student;  
Student* headOfStudents = NULL;

//学生课程信息 
typedef struct CourseInfo {  
    int courseId;                 // 课程编号  
    char name[50];                 // 姓名  
    char studentId[20];             // 学号  
    char semester[20];              // 学期  
    char courseName[100];           // 上课课程名称  
    char courseTime[50];            // 课程时间  
    char note[100];                 // 备注  
    struct CourseInfo* next;         // 下一个学生的指针  
} CourseInfo;
CourseInfo* headOfCourseInfo = NULL;
// 定义课程结构体  
typedef struct Course {  
    int courseId;             // 课程编号  
    char courseName[100];      // 课程名称  
    char courseDescription[200]; // 课程简介  
    char teacher[50];           // 任课教师  
    char courseTime[20];        // 课程时间  
    char courseAddress[100];    // 课程地址  
    char note[100];              // 备注  
    struct Course* next;         // 下一个课程的指针(对于同一学生)  
} Course;  
Course* headOfCourse = NULL;


void input() {  
    int choice;  
    do {  
        printf("\n请选择要录入的信息类型:\n");  
        printf("1. 学生信息\n");  
        printf("2. 课程信息\n");  
        printf("3. 学生课程信息\n"); 
        printf("输入4退出\n");
        scanf("%d", &choice);  
        switch(choice) {  
                      case 1:  
                {  
                    Student* newStudent = (Student*)malloc(sizeof(Student)); // 创建新的学生结构体实例  
                    if (newStudent == NULL) {  
                        printf("内存分配失败!\n");  
                        break;  
                    }  
                    printf("您选择了录入学生信息。\n");  
                    printf("请输入学生编号(id):");  
                    scanf("%d", &newStudent->id);  
                    printf("请输入学生姓名:");  
                    scanf("%s", newStudent->name);  
                    printf("请输入学生学号:");  
                    scanf("%s", newStudent->studentId);  
                    printf("请输入学生学院:");  
                    scanf("%s", newStudent->college);  
                    printf("请输入学生班级:");  
                    scanf("%s", newStudent->className);  
                    printf("请输入学生专业:");  
                    scanf("%s", newStudent->major);  
                    printf("请输入学生电话:");  
                    scanf("%s", newStudent->phone);  
                    printf("请输入学生年龄:");  
                    scanf("%d", &newStudent->age);  
                    printf("请输入学生生日:");  
                    scanf("%s", newStudent->birthday);  
                    printf("请输入学生宿舍:");  
                    scanf("%s", newStudent->dormitory);  
                    newStudent->next = NULL;   // 将新学生的指针初始化为NULL,表示该节点是链表的最后一个节点。  
                    if (headOfStudents == NULL) {  // 如果链表为空,将新节点设置为头节点。  
                        headOfStudents = newStudent;  
                    } else {  // 如果链表不为空,找到最后一个节点并修改其指针。  
                        Student* current = headOfStudents;  
                        while (current->next != NULL) {  // 遍历链表找到最后一个节点。  
                            current = current->next;  
                        }  
                        current->next = newStudent;  // 将最后一个节点的指针指向新节点。  
                    }  
                    printf("学生信息录入成功!\n");  // 打印成功消息。  
                } break;
                break;  
         case 2:  
    {  
        Course* newCourse = (Course*)malloc(sizeof(Course)); // 创建新的课程结构体实例  
        printf("请输入课程编号(courseId):");  
        scanf("%d", &newCourse->courseId);  
        printf("请输入课程名称:");  
        scanf("%s", newCourse->courseName);  
        printf("请输入课程简介:");  
        scanf("%s", newCourse->courseDescription);  
        printf("请输入任课教师:");  
        scanf("%s", newCourse->teacher);  
        printf("请输入课程时间:");  
        scanf("%s", newCourse->courseTime);  
        printf("请输入课程地址:");  
        scanf("%s", newCourse->courseAddress);  
        printf("请输入备注:");  
        scanf("%s", newCourse->note);  
            newCourse->next = NULL;   // 将新学生的指针初始化为NULL,表示该节点是链表的最后一个节点。  
                    if (headOfCourse == NULL) {  // 如果链表为空,将新节点设置为头节点。  
                        headOfCourse = newCourse;  
                    } else {  // 如果链表不为空,找到最后一个节点并修改其指针。  
                      Course* current = headOfCourse;  
                        while (current->next != NULL) {  // 遍历链表找到最后一个节点。  
                            current = current->next;  
                        }  
                        current->next = newCourse;  // 将最后一个节点的指针指向新节点。  
                    } 
                     printf("课程信息录入成功!\n"); 
                    
    }  
    break;
             case 3:  
    {  
        CourseInfo * newCourseInfo  = (CourseInfo *)malloc(sizeof(CourseInfo )); // 创建新的课程结构体实例  
        printf("请输入课程编号(courseId):");  
        scanf("%d", &newCourseInfo->courseId);  
        printf("请输入学生姓名:");  
        scanf("%s", newCourseInfo->name);  
        printf("请输入学生学号:");  
        scanf("%s", newCourseInfo->studentId);  
        printf("请输入学期:");  
        scanf("%s", newCourseInfo->semester);  
        printf("请输入课程名称:");  
        scanf("%s",newCourseInfo->courseName);  
        printf("请输入课程时间:");  
        scanf("%s", newCourseInfo->courseTime);  
        printf("请输入备注:");  
        scanf("%s", newCourseInfo->note);  
        newCourseInfo->next = NULL; 
            newCourseInfo->next = NULL;   // 将新学生的指针初始化为NULL,表示该节点是链表的最后一个节点。  
                    if (headOfCourseInfo == NULL) {  // 如果链表为空,将新节点设置为头节点。  
                        headOfCourseInfo = newCourseInfo;  
                    } else {  // 如果链表不为空,找到最后一个节点并修改其指针。  
                     CourseInfo* current = headOfCourseInfo;  
                        while (current->next != NULL) {  // 遍历链表找到最后一个节点。  
                            current = current->next;  
                        }  
                        current->next = newCourseInfo;  // 将最后一个节点的指针指向新节点。  
                    } 
        printf("课程信息录入成功!\n");  
    }  
    break;  
    case 4:
        break;
            default:  
                printf("无效的选择,请重新选择。\n");  
        }  
    } while(choice != 4); // 如果用户没有选择1、2或3,则继续循环。  
}


void delete1(){ 
         int type;
 printf("\n请选择要删除的信息类型:\n");  
        printf("1. 学生信息\n");  
        printf("2. 课程信息\n");  
        printf("3. 学生课程信息\n"); 
        printf("输入4退出\n");
        scanf("%d", &type);  
    switch (type) {  
          case 1: {    
    printf("请输入要删除的学生编号(id):");      
    int id;      
    scanf("%d", &id);      
    Student* current = headOfStudents;     
    Student* prev = NULL;      
    while (current != NULL) {      
        if (current->id == id) {      
            if (prev == NULL) { // 删除头部节点    
                headOfStudents = current->next;     
                free(current); // 释放内存空间    
            } else { // 删除中间节点或尾部节点    
                prev->next = current->next;     
                free(current); // 释放内存空间    
            }      
            printf("学生信息删除成功!\n");      
            return;      
        }      
        prev = current;      
        current = current->next;      
    }      
    printf("没有找到该学生信息!\n");      
    break;      
}      
        case 2: {
        
            printf("请输入要删除的课程编号(courseId):");  
            int courseId;  
            scanf("%d", &courseId);  
            Course* current = headOfCourse;
            Course* prev = NULL;  
            while (current != NULL) {  
                if (current->courseId == courseId) {  
                    if (prev == NULL) { // 删除头部节点  
                        headOfCourse = current->next;  
                    } else { // 删除中间节点或尾部节点  
                        prev->next = current->next;  
                    }  
                    free(current); // 释放内存空间  
                    printf("课程信息删除成功!\n");  
                    return;  
                }  
                prev = current;  
                current = current->next;  
            }  
            printf("没有找到该课程信息!\n");  
        
            break;  
        }
       case 3:  
       {
    
            printf("请输入要删除的课程编号(courseId):");  
            int courseId;  
            scanf("%d", &courseId);  
            CourseInfo* current = headOfCourseInfo;
            CourseInfo* prev = NULL;  
            while (current != NULL) {  
                if (current->courseId == courseId) {  
                    if (prev == NULL) { // 删除头部节点  
                        headOfCourseInfo = current->next;  
                    } else { // 删除中间节点或尾部节点  
                        prev->next = current->next;  
                    }  
                    free(current); // 释放内存空间  
                    printf("学生课程信息删除成功!\n");  
                    return;  
                } 
                else {
                
                prev = current;  
                current = current->next; 
            }
            }  
            if(current==NULL)
            printf("没有找到该课程信息!\n");  
        return;
        }
    }
}

void search()
{

     int choice;  
    printf("\n请选择要查找的信息类型:\n");  
        printf("1. 学生信息\n");  
        printf("2. 课程信息\n");  
        printf("3. 学生课程信息\n"); 
        printf("输入4退出\n");
        scanf("%d", &choice);  
    switch (choice)
    {
    case 1:
    {
            int type;
                printf("输入1 按姓名查找\n");
                printf("输入2 按学号查找\n");
                printf("请输入查找方式:\n");
                scanf("%d",&type);
                 switch(type)
                 {
            
                     case 1:
                    {
                
                             printf("请输入要查找的学生姓名:");      
                             char name[10];      
                             scanf("%s", name);      
                             Student* current = headOfStudents;     
                             Student* prev = NULL;      
                                while (current != NULL) 
                                    {
                                    
                              if (strcmp(current->name,name)==0) 
                        {
                        
                              printf("学生信息:\n");  
                              printf("编号\t姓名\t学号\t学院\t班级\t专业\t电话\t年龄\t生日\t宿舍\n"); // 打印表头    
                              printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%s\t%s\n", current->id, current->name, current->studentId, current->college, current->className, current->major, current->phone, current->age, current->birthday, current->dormitory); // 按照制表位输出学生信息  
                    return;
                     }
                             else
                              {
                               prev = current; 
                              current = current->next;  
                    }
                }
                         if(current==NULL)
                        printf("未查找到该学生!\n"); 
                         return;
            }        
            return; 
            
     case 2:
            {
            
             printf("请输入要查找的学生姓名:");      
                             char id[10];      
                             scanf("%s", id);      
                             Student* current = headOfStudents;     
                             Student* prev = NULL;      
                                while (current != NULL) {   
                              if (strcmp(current->studentId,id)==0) 
                             {
                              printf("学生信息:\n");  
                              printf("编号\t姓名\t学号\t学院\t班级\t专业\t电话\t年龄\t生日\t宿舍\n"); // 打印表头    
                              printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%s\t%s\n", current->id, current->name, current->studentId, current->college, current->className, current->major, current->phone, current->age, current->birthday, current->dormitory); // 按照制表位输出学生信息  
                        return;
                        }
                            else
                            {
                            prev = current; 
                              current = current->next;  
            }
                }
                        if(current==NULL)
                        printf("未查找到该学生!\n"); 
                     return;
}
}
        break;
}
     case 2:
    {
    
            int type;
                printf("输入1 按课程编号查找\n");
                printf("输入2 按课程名称查找\n");
                printf("输入3 按任课教师查找\n"); 
                printf("请输入查找方式:\n");
                scanf("%d",&type);    
                switch(type)
                {
                
                    case 1:
                    {
                    printf("请输入要查找的课程编号:");      
                             int name;      
                             scanf("%d",&name);      
                              Course* current = headOfCourse;     
                              Course* prev = NULL;      
                                while (current != NULL) {
                              if(current->courseId==name) 
                        { 
                        printf("课程编号\t课程名称\t课程简介\t任课教师\t课程时间\t课程地址\t备注\n"); // 打印表头    
                        printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\n", current->courseId, current->courseName, current->courseDescription, current->teacher, current->courseTime, current->courseAddress, current->note); // 按照制表位输出课程信息    
                              return; 
                          }
                              else
                              {
                             prev = current; 
                              current = current->next;   
                    }
                    }
                        if(current==NULL)
                        printf("未查找到该课程!\n"); 
                          return;    
        }
             return;

                 case 2: 
                {
                
                         printf("请输入要查找的课程名称:");      
                             char name[10];      
                             scanf("%s", name);      
                              Course* current = headOfCourse;     
                              Course* prev = NULL;      
                                while (current != NULL) {    
                              if (strcmp(current->courseName,name)==0) 
                               {
                               
                             printf("课程编号\t课程名称\t课程简介\t任课教师\t课程时间\t课程地址\t备注\n"); // 打印表头  
                             printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\n", current->courseId, current->courseName,
                               current->courseDescription, current->teacher, current->courseTime, current->courseAddress, current->note); // 按照制表位输出课程信息  
                         return;
                         }
                              else{
                              prev = current; 
                              current = current->next;   
                    }
                }
                         if(current==NULL)
                        printf("未查找到该课程!\n"); 
                          return;    
            }
                return;

               case 3:{
            
                   
                           printf("请输入要查找的任课教师:");      
                             char name[10];      
                             scanf("%s", name);      
                              Course* current = headOfCourse;     
                              Course* prev = NULL;      
                                while (current != NULL) {    
                              if (strcmp(current->teacher,name)==0) {
                             printf("课程编号\t课程名称\t课程简介\t任课教师\t课程时间\t课程地址\t备注\n"); // 打印表头  
                              printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\n", current->courseId, current->courseName,    
                             current->courseDescription, current->teacher, current->courseTime, current->courseAddress, current->note); // 按照制表位输出课程信息  
                     return;
                      }
                          else
                          {
                          prev = current; 
                                current = current->next;   
                          }
                    }
                         if(current==NULL) 
                        printf("未查找到该课程!\n"); 
                          return;
            }
            return;

}
break;
}

                 case 3:
            {
              int type;
                printf("输入1 按学生姓名查找\n");
                printf("输入2 按学生学号找\n");
                printf("请输入查找方式:\n"); 
                scanf("%d",&type);    
                switch(type)
                {
                case 1:
                {
                         printf("请输入学生姓名:");      
                             char name[10];      
                             scanf("%s", name);      
                              CourseInfo * current = headOfCourseInfo ;     
                              CourseInfo * prev = NULL;      
                                while (current != NULL) {    
                              if (strcmp(current->name,name)==0) {
                                printf("课程编号\t姓名\t学号\t学期\t上课课程名称\t课程时间\t备注\n");  
                             printf("%-10d\%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n",  
       current->courseId,   
       current->name,   
       current->studentId,   
       current->semester,   
       current->courseName,   
       current->courseTime,   
       current->note);return;
                    }
                     else
                          {
                          prev = current; 
                                current = current->next;   
                          }
                    }
                         if(current==NULL) 
                        printf("未查找到该学生课程信息!\n"); 
                          return;
            
            }
                return;
                
                
                case 2:
                    {
                        
                        printf("请输入学生学号:");      
                             char name[10];      
                             scanf("%s", name);      
                              CourseInfo * current = headOfCourseInfo ;     
                              CourseInfo * prev = NULL;      
                                while (current != NULL) {    
                              if (strcmp(current->name,name)==0) {
                                 printf("%d\t%s\t%s\t%s\t%s\t%s\t%s\n", current->courseId,  
                       current->name,   current->studentId,   current->semester,   current->courseName,   current->courseTime,   current->note);  
                      return;
                    }
                     else
                          {
                          prev = current; 
                                current = current->next;   
                          }
                    }
                         if(current==NULL) 
                        printf("未查找到该学生课程信息!\n"); 
                          return;
                    }
                    return;
          }
          
            }
            break;
             
}

}

void count()
{
    int type;
                printf("输入1 统计学生数量及具体情况\n");
                printf("输入2 统计课程数量及具体情况\n");
                printf("输入3 统计显示所有学生选课数量及具体情况") ;
                printf("请输入查找方式:\n"); 
                scanf("%d",&type);    
                switch(type)
                {
                    case 1:
                    {
                        Student* current = headOfStudents;     
                            
                   int count = 0;  
                      printf("姓名\t学号\n"); // tab分隔的姓名和学号  
                      while (current != NULL) {  
        printf("%s\t%s\n", current->name, current->studentId); // 输出姓名和学号  
        count++;  
        current = current->next; // 移动到下一个学生  
    }  
           printf("总共有 %d 个学生\n", count); // 输出学生总数                      
                     } 
                    break; 
                case 2:
                {
                Course* current = headOfCourse;    
                            
                   int count = 0;  
                      printf("课程名称\t任课老师\n"); // tab分隔的姓名和学号  
                      while (current != NULL) {  
        printf("%-10s\t%-10s\n", current->courseName, current->teacher); // 输出姓名和学号  
        count++;  
        current = current->next; //   
    }  
           printf("总共有 %d 门课\n", count); 
                    
                    }    
                    break;
                    case 3:
                    {
                        CourseInfo * current = headOfCourseInfo ;   
                            
                   int count = 0;  
                      printf("选课信息\t课程时间\n"); // tab分隔的姓名和学号  
                      while (current != NULL) {  
        printf("%-10s\t%-10s\n", current->courseName, current->courseTime); // 输出姓名和学号  
        count++;  
        current = current->next; //   
    }  
           printf("总共有 %d 门课\n", count); 
                        
                        }    
                        break;
                }
    
    
    
 } 
 
   
 
void save()   
{  
    int type;  
    printf("输入1 读取文件中的信息\n");  
    printf("输入2 保存信息\n");   
    printf("请输入查找方式:\n");   
    scanf("%d", &type);    
  
    switch(type) {  
case 1: {  // 从本地文件读取学生信息  
        FILE* file = fopen("D:\\yuzhuoo\\Documents\\student.txt", "r");  // 打开文件  
        if (file == NULL) {  // 如果文件打开失败  
            printf("Error: Failed to open file.\n");  
            break;  // 结束case 1  
        }  
        Student* newStudent = NULL;  // 初始化新学生记录为空  
        while (fscanf(file, "%d %s %s %s %s %s %d %s", &newStudent->id, newStudent->name, newStudent->studentId, newStudent->college, newStudent->className, newStudent->major, &newStudent->age, newStudent->birthday) != EOF) {  // 循环读取文件内容  
            newStudent = (Student*)malloc(sizeof(Student));  // 分配内存空间  
            if (newStudent == NULL) {  // 如果内存分配失败  
                printf("Error: Failed to allocate memory for new student.\n");  
                break;  // 结束循环和case 1  
            }  
            newStudent->next = NULL;   // 将新学生的指针初始化为NULL,表示该节点是链表的最后一个节点。  
            if (headOfStudents == NULL) {  // 如果链表为空,将新节点设置为头节点。  
                headOfStudents = newStudent;    
            } else {  // 如果链表不为空,找到最后一个节点并修改其指针。  
                Student* current = headOfStudents;    
                while (current->next != NULL) {  // 遍历链表找到最后一个节点。    
                    current = current->next;    
                }    
                current->next = newStudent;  // 将最后一个节点的指针指向新节点。    
            }   
        }  
        fclose(file);  // 关闭文件  
        break;  // 结束case 1    
    }  
                  /*  case 2:  
                        // 这里添加读取课程信息的代码  
                        break;  
                    case 3:  
                        // 这里添加读取学生选课信息的代码  
                        break;  
                    default:  
                        printf("无效的输入!\n");  
                }  
            }   
            break;  
        case 2:  
            // 这里添加保存信息的代码  
            break;  
      */  default:  
            printf("无效的输入!\n");  
    }   
}
// 主函数
int main(){
    int choice = 0;
    while (choice != 7) { // 7是退出选项的编号
        printf("|请选择操作:    |\n");
        printf("|1. 录入信息     |\n");
        printf("|2. 删除信息     |\n");
        printf("|3. 查找信息     |\n");
        printf("|4. 统计信息     |\n");
        printf("|5. 存取及备份   |\n");
        printf("|6. 退出         |\n");
        scanf("%d", &choice); // 获取用户选择的操作编号
        switch (choice) { // 根据用户选择的操作编号执行相应的操作
            case 1:
                input();
                break;
           case 2:
                delete1();
                break;
            case 3:
                search();
                break;
          case 4:
                 count();
                 break;
         case 5:
               save();
                break;
            case 6: // 如果用户选择退出,直接退出程序。
                printf("谢谢使用!\n");
                return 0; // 退出程序 
            default: // 如果用户输入的操作编号不在选项范围内,提示用户重新输入。
                printf("输入有误,请重新输入!\n");
                break;
        }
    }
    return 0; // 退出程序时返回0,表示程序正常结束。
}


  • 写回答

2条回答 默认 最新

  • micthis 2024-01-07 09:09
    关注
    Student* newStudent = NULL;  // 初始化新学生记录为空  
    while (fscanf(file, "%d %s %s %s %s %s %d %s", &newStudent->id, newStudent->name, newStudent->studentId, newStudent->college, newStudent->className, newStudent->major, &newStudent->age, newStudent->birthday) != EOF) {  // 循环读取文件内容 
    

    这里有问题,开始时newStudent等于NULL怎么能调用fscanf?

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

报告相同问题?

问题事件

  • 系统已结题 1月25日
  • 已采纳回答 1月17日
  • 创建了问题 1月7日

悬赏问题

  • ¥20 wordpress如何限制ip访问频率
  • ¥15 自研小游戏,需要后台服务器存储用户数据关卡配置等数据
  • ¥15 请求解答odoo17外发加工某工序的实操方法
  • ¥20 IDEA ssm项目 跳转页面报错500
  • ¥20 系统直接进入应急模式了,请教一下,人要裂开了
  • ¥15 页面初次加载时,JS调用对象可以调用成功,但是一旦跳转到另一个页面,再跳转回来后这个对象就显示undefind了,调用也调用不了了,什么原因?
  • ¥15 来个厉害的程序开发的,安排点活给你做
  • ¥15 rexroth indramotion MTX micro系统轴耦合编程
  • ¥100 springboot2.7.x 整合 sharding 的问题
  • ¥15 如何通过命令行操作统信360安全浏览器?