在线提问学生信息管理系统问题

添加后查找不到文件内容
显示记录是乱码

img

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>      //控制台头文件 包含getch
struct student
{
    char no[20];
    char name[50];
    int  score[10];
    char sex[10];
    char year[10];
    int month[20];
    int day[20];
    char tel[15];

};
char filename[100] = "studd.txt"; //设置文件名
FILE* fp;

void append(); //添加函数声明
void search(); //查找函数声明
void del(); //删除函数声明
void modify(); //修改函数声明
void output(); //显示函数声明
 
int main(void)       //无类型
{
    int num;
    while (1)
    {
        printf(" ***学生成绩系统***\n ");
        
        printf(" 1.添加记录\n");
        printf(" 2.查找记录\n");
        printf(" 3.修改记录\n");
        printf(" 4.删除记录\n");
        printf(" 5.显示记录\n");
        printf(" 0.退出系统\n");
        printf(" 选择序号0-5:");
        scanf("%d", &num);
        if (num >= 0 && num <= 5)
        {
            switch (num)
            {
            
            case 1:append(); break;
            case 2:search(); break;
            case 3:modify(); break;
            case 4:del(); break;
            case 5:output(); break;
            case 0:
            exit(1);
            }
            printf(" 操作完毕,请再次选择!\n");
        }
        else
            printf(" 选择错误,请再次选择!\n");
    }
    getch();         //数据自动读取
    return 0;         //函数的返回值
}
//创建记录

//添加记录
void append()
{
    struct student stu;
    if ((fp = fopen(filename, "w")) == NULL)   //追加
    {
        printf(" Cannot Open File!");
        exit(0);
    }
    printf("请输入学号\n");
    scanf("%s",stu.no);
    printf("请输入姓名\n");
    scanf("%s",stu.name);
    printf("请输入成绩\n");
    scanf("%d",stu.score);
    printf("请输入性别\n");
    scanf("%s",stu.sex); 
    printf("请输入年\n");
    scanf("%s",stu.year);
    printf("请输入月\n");
    scanf("%d",stu.month);
    printf("请输入日\n");
    scanf("%d",stu.day);
    printf("请输入电话\n");
    scanf("%s",stu.tel);
    fprintf(fp, "%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.year,stu.month,stu.day,stu.tel);
    fclose(fp);
    return 0;
}
//查找记录
void search()
{
    int k = 0;
char nokey[12];
    struct student stu;
    printf(" 请输入学号:\n");
    scanf("%s", nokey);
    if ((fp = fopen(filename, "r")) == NULL)   //读
    {
        printf(" Cannot Open File!\n");
        exit(0);
    }
    fseek(fp, 1L * sizeof(struct student), 0);      //将文件指针移动
    while (!feof(fp))       //检查文件是否结束
    {
        fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.day);
        if (strcmp(nokey, stu.no) == 0)    //字符串比较
        {
            printf(" 已查找到,该记录为:\n ");
            scanf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
            k = 1;
            break;
        }
    }
    if (!k)
        printf(" 文件中无此人的记录。\n");
    fclose(fp);
}
//修改记录
void modify()
{
    int k = 0;
    long position;
    char nokey[10];
    struct student stu;
    printf(" 请输入学号:");
    scanf("%s", nokey);
    if ((fp = fopen(filename, "r+")) == NULL)
    {
        printf(" Cannot Open File!\n");
        exit(0);
    }
    fseek(fp, 1L * sizeof(struct student), 0);
    while (!feof(fp))
    {
        fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, &stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
        if (strcmp(nokey, stu.no) == 0)
        {
            position = ftell(fp);
            k = 1;
            break;
        }
    }
    if (k)
    {
        printf(" 已查找到,该记录为: ");
       
        printf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
        printf(" 请输入新的学号、姓名及成绩:");
        scanf("%s%s%d%s%s%s%d%s", stu.no, stu.name, &stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
        fseek(fp, position - 1L * sizeof(struct student), SEEK_SET);
        fprintf(fp, " %s%s%d%s%s%d%d%s", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
    }
    else
        printf(" 文件中无此人的记录。\n");
    fclose(fp);
}
//删除记录
void del()
{
    int m, k = 0;
    long position;
    char nokey[10];
struct student stu;
    printf(" 请输入学号:");
    scanf("%s", nokey);
    if ((fp = fopen(filename, "r+")) == NULL)
    {
        printf(" Cannot Open File!\n");
        exit(0);
    }
    fseek(fp, 1L * sizeof(struct student), 0);
    while (!feof(fp))
    {
        fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, &stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
        if (strcmp(nokey, stu.no) == 0)
        {
            position = ftell(fp);  //fp文件当前读写位置
            k = 1;
            break;
        }
    }
    if (k)
    {
        printf(" 已查找到,该记录为: \n");
        
        printf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
        printf(" 确实要删除记录,请按1;不删除记录,请按0:");
        scanf("%d", &m);
        if (m)
        {
            fseek(fp, position - 1L * sizeof(struct student), SEEK_SET);
            fprintf(fp, "%s%s%d%s%s%d%d%s", "", "", "");
        }
    }
    else
        printf(" 文件中无此人的记录。\n");
    fclose(fp);
}
//显示记录
void output()
{
    struct student stu;
    if ((fp = fopen(filename, "r")) == NULL)
    {
        printf(" Cannot Open File!");
        exit(0);
    }
    printf(" 文件内容为: \n");
    fseek(fp, 1L * sizeof(struct student), 0);
    while (!feof(fp))
    {
        fscanf(fp, "%s%s%d%s%s%d%d%s ", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
        printf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score,stu.sex,stu.year,stu.month,stu.day,stu.tel);
    }
    fclose(fp);
}

修改如下,供参考:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>      //控制台头文件 包含getch
struct student
{
    char no[20];
    char name[50];
    int  score;     //[10]; 修改 
    char sex[10];
    char year[10];
    int  month;    //[20];  修改
    int  day;      //[20];  修改
    char tel[15];
};
char filename[100] = "studd.txt"; //设置文件名
FILE* fp;

void append(); //添加函数声明
void search(); //查找函数声明
void del(); //删除函数声明
void modify(); //修改函数声明
void output(); //显示函数声明

int main(void)       //无类型
{
    int num;
    while (1)
    {
        printf(" ***学生成绩系统***\n ");

        printf(" 1.添加记录\n");
        printf(" 2.查找记录\n");
        printf(" 3.修改记录\n");
        printf(" 4.删除记录\n");
        printf(" 5.显示记录\n");
        printf(" 0.退出系统\n");
        printf(" 选择序号0-5:");
        scanf("%d", &num);
        if (num >= 0 && num <= 5)
        {
            switch (num)
            {

            case 1:append(); break;
            case 2:search(); break;
            case 3:modify(); break;
            case 4:del(); break;
            case 5:output(); break;
            case 0:
                exit(1);
            }
            printf(" 操作完毕,请再次选择!\n");
        }
        else
            printf(" 选择错误,请再次选择!\n");
    }
    getch();         //数据自动读取
    return 0;         //函数的返回值
}
//创建记录

//添加记录
void append()
{
    struct student stu;
    if ((fp = fopen(filename, "a")) == NULL)   //修改 
        //if ((fp = fopen(filename, "w"))
    {
        printf(" Cannot Open File!");
        exit(0);
    }
    printf("请输入学号\n");
    scanf("%s", stu.no);
    printf("请输入姓名\n");
    scanf("%s", stu.name);
    printf("请输入成绩\n");
    scanf("%d", &stu.score); //scanf("%d", stu.score);修改 
    printf("请输入性别\n");
    scanf("%s", stu.sex);
    printf("请输入年\n");
    scanf("%s", stu.year);
    printf("请输入月\n");
    scanf("%d", &stu.month);//scanf("%d", stu.month);修改 
    printf("请输入日\n");
    scanf("%d", &stu.day);  //scanf("%d", stu.day); 修改 
    printf("请输入电话\n");
    scanf("%s", stu.tel);
    fprintf(fp, "%s %s %d %s %s %d %d %s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);  // 修改
    //fprintf(fp, "%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.year, stu.month, stu.day, stu.tel);
    fclose(fp);
    return;    //0;
}
//查找记录
void search()
{
    int k = 0;
    char nokey[12];
    struct student stu;
    printf(" 请输入学号:\n");
    scanf("%s", nokey);
    if ((fp = fopen(filename, "r")) == NULL)   //读
    {
        printf(" Cannot Open File!\n");
        exit(0);
    }
    //fseek(fp, 1L * sizeof(struct student), 0); //将文件指针移动
    while (!feof(fp))       //检查文件是否结束
    {
        fscanf(fp, "%s %s %d %s %s %d %d %s\n", stu.no, stu.name, &stu.score, stu.sex, stu.year, &stu.month, &stu.day, stu.tel); //修改 
        //fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, &stu.score, stu.sex, stu.year, stu.month, &stu.day, stu.day);
        if (strcmp(nokey, stu.no) == 0)    //字符串比较
        {
            printf(" 已查找到,该记录为:\n ");
            printf("%s %s %d %s %s %d %d %s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel); //修改 
            //scanf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
            k = 1;
            break;
        }
    }
    if (!k)
        printf(" 文件中无此人的记录。\n");
    fclose(fp);
}
//修改记录
void modify()
{
    int k = 0;
    long position;
    char nokey[10];
    struct student stu;
    printf(" 请输入学号:");
    scanf("%s", nokey);
    if ((fp = fopen(filename, "r+")) == NULL)
    {
        printf(" Cannot Open File!\n");
        exit(0);
    }
    //fseek(fp, 1L * sizeof(struct student), 0);
    while (!feof(fp))
    {
        fscanf(fp, "%s %s %d %s %s %d %d %s\n", stu.no, stu.name, &stu.score, stu.sex, stu.year, &stu.month, &stu.day, stu.tel); //修改 
        //fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, &stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
        if (strcmp(nokey, stu.no) == 0)
        {
            position = ftell(fp);
            k = 1;
            break;
        }
    }
    if (k)
    {
        printf(" 已查找到,该记录为: ");
        printf("%s %s %d %s %s %d %d %s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel); //修改 
        //printf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
        printf(" 请输入新的学号、姓名及成绩:");
        scanf("%s %s %d %s %s %d %d %s", stu.no, stu.name, &stu.score, stu.sex, stu.year, &stu.month, &stu.day, stu.tel); //修改 
        //scanf("%s%s%d%s%s%s%d%s", stu.no, stu.name, &stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
        fseek(fp, position - 1L * sizeof(struct student), SEEK_SET);
        fprintf(fp, "%s %s %d %s %s %d %d %s", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);//修改 
        //fprintf(fp, " %s%s%d%s%s%d%d%s", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
    }
    else
        printf(" 文件中无此人的记录。\n");
    fclose(fp);
}
//删除记录
void del()
{
    int m, k = 0;
    long position;
    char nokey[10];
    struct student stu;
    printf(" 请输入学号:");
    scanf("%s", nokey);
    if ((fp = fopen(filename, "r+")) == NULL)
    {
        printf(" Cannot Open File!\n");
        exit(0);
    }
    //fseek(fp, 1L * sizeof(struct student), 0);
    while (!feof(fp))
    {
        fscanf(fp, "%s %s %d %s %s %d %d %s\n", stu.no, stu.name, &stu.score, stu.sex, stu.year, &stu.month, &stu.day, stu.tel);//修改 
        //fscanf(fp, "%s%s%d%s%s%d%d%s", stu.no, stu.name, &stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
        if (strcmp(nokey, stu.no) == 0)
        {
            position = ftell(fp);  //fp文件当前读写位置
            k = 1;
            break;
        }
    }
    if (k)
    {
        printf(" 已查找到,该记录为: \n");

        printf("%s %s %d %s %s %d %d %s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
        printf(" 确实要删除记录,请按1;不删除记录,请按0:");
        scanf("%d", &m);
        if (m)
        {
            fseek(fp, position - 1L * sizeof(struct student), SEEK_SET);
            fprintf(fp, "%s %s %d %s %s %d %d %s", "", "", "","","","","",""); //修改 
        }
    }
    else
        printf(" 文件中无此人的记录。\n");
    fclose(fp);
}
//显示记录
void output()
{
    struct student stu;
    if ((fp = fopen(filename, "r")) == NULL)
    {
        printf(" Cannot Open File!");
        exit(0);
    }
    printf(" 文件内容为: \n");
    //fseek(fp, 1L * sizeof(struct student), 0);
    while (1)   //while (!feof(fp))
    {
        if (fscanf(fp, "%s %s %d %s %s %d %d %s\n", stu.no, stu.name, &stu.score, stu.sex, stu.year, &stu.month, &stu.day, stu.tel) == 8)//修改 
            //fscanf(fp, "%s%s%d%s%s%d%d%s ", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
            printf("%s %s %d %s %s %d %d %s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);//修改 
           //printf("%s%s%d%s%s%d%d%s\n", stu.no, stu.name, stu.score, stu.sex, stu.year, stu.month, stu.day, stu.tel);
        else
            break;
    }
    fclose(fp);
}

结构体中,int score[10];改为int socre;你定义数组干啥呢?
int month[20];
int day[20]; 定义20是要干啥,为什么年是char类型,而月日是int???int就不要用数组

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7627235
  • 这篇博客你也可以参考下:数据结构顺序表之学生信息管理系统简单示例
  • 除此之外, 这篇博客: 牛客竞赛语法入门班顺序结构习题【完结】中的 牛牛学加法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include<stdio.h>
    int main(void)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        printf("%d",a+b);
        return 0;
    }
    
  • 您还可以看一下 褚英昊老师的深度学习与计算机视觉课程中的 模板匹配和经典算法的不足小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答

    根据提供的参考代码和问题描述,存在两个问题需要解决:

    问题1:添加学生信息后无法正确查找到文件内容

    根据提供的参考代码和问题描述,可以确定问题出在添加学生信息后无法正确查找到文件内容的地方。以下是解决该问题的步骤和代码示例:

    1. 打开添加学生信息的函数 input
    2. 在函数 input 中,修改文件打开的模式为追加模式,即将 "wb" 修改为 "ab",以便在已有文件内容的基础上添加新的学生信息。
    3. 在添加学生信息之前,先将指针移动到文件的末尾,以便在已有内容的后面添加新的学生信息。
    4. 修改循环体内的 fwrite 函数的参数,将 sizeof(s[i]) 修改为 sizeof(struct student)
    5. 关闭文件。

    修改后的代码如下:

    void input(struct student s[], int n) {
        int i, j;
        FILE* fp;
        double ave = 0;
        fp = fopen("d:\\lcy\\bigdata.txt", "ab");
    
        fseek(fp, 0, SEEK_END);
    
        for (i = 0; i < 3; i++) {
            gets(s[i].XH);
            gets(s[i].name);
            for (j = 0; j < 3; j++) {
                scanf("%lf", &s[i].score[j]);
                s[i].ave += s[i].score[j];
            }
            s[i].ave /= 3;
            fwrite(&s[i], sizeof(struct student), 1, fp);
            getchar();
        }
    
        fclose(fp);
    }
    

    问题2:查询学生信息时,显示的记录是乱码

    根据提供的参考代码和问题描述,可以确定问题出在查询学生信息时,显示的记录是乱码的地方。以下是解决该问题的步骤和代码示例:

    1. 打开输出学生信息的函数 output
    2. 在函数 output 中,修改文件打开的模式为读取模式,即将 "rb" 修改为 "r"
    3. 修改循环体内的 fread 函数的参数,将 sizeof(s[i]) 修改为 sizeof(struct student)
    4. 修改输出学生信息的格式,确保每个学生的信息以换行符 \n 结尾。
    5. 关闭文件。

    修改后的代码如下:

    void output(struct student s[], int n) {
        FILE* fp;
        int i, j;
        fp = fopen("d:\\lcy\\stud_sort.txt", "r");
    
        for (i = 0; i < 3; i++) {
            fread(&s[i], sizeof(struct student), 1, fp);
            puts(s[i].XH);
            puts(s[i].name);
            for (j = 0; j < 3; j++)
                printf("%lf\t", s[i].score[j]);
            printf("\n");
        }
    
        fclose(fp);
    }
    

    请执行以上步骤来解决该问题。

    如果还有其他问题,请详细描述,以便我提供进一步的帮助。