这个图书管理代码出问题了,能在终端输入,但输入完要存文件就这样了,这个应该怎么解决

这个应该怎么处理,忙活一天,发现自己弄的代码运行不出来,应该怎么解决啊,刚学c还不太熟练,有很多不懂的地方

img

img

img

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7765155
  • 你也可以参考下这篇文章:有一篇文章,共3行文字,每行80个字符。要求分别统计其中英文大写字母,小写字母,数字,空格以及其他字符的个数
  • 除此之外, 这篇博客: 经典C语言代码摆烂现场中的 用汉语来表述的话,应该要先定义一个数字变量,然后此时用户通过键盘输入一个数字,电脑去扫描存储到内存中的数据,判断此时用户输入的数据跟我们要求的数据是否符合条件,如果符合条件的话,那就满足第1条语句代码块,如果不满足条件那就不执行,执行else部分。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

  • #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int score;
        
        printf("请输入成绩:\n");
        
        scanf("%d",&score);
        
        if(score >= 90){
            printf("成绩优秀\n");
        }
        else if(score > 75 && score <= 90){
            printf("成绩良好\n");
        }
        else if(score >= 60 && score <= 75){
            printf("成绩及格\n");
        }
        else if(score > 40 && score <60){
            printf("不及格\n");
        }
        else{
            printf("很差劲啊,退学吧\n");
        }
        
        system("color 2");
        system("pause");
        return 0;
    }

    第3段代码是if-else多条件循环语句的升级版,意思是老师输入考生考试成绩,并判断该考生处于什么样的学习水平。IT男超哥的思考方式如下:定义一个分数变量,然后用户输入学生成绩,电脑去扫描用户输入的成绩,如果学生成绩大于等于90的时候,那么该生成绩优秀;如果学生成绩在75到90分,说明该生成绩良好,如果学生成绩在60~75之间,说明该生成绩合格,如果学生成绩在40~60之间,说明该生成绩不合格,否则小于40分的时候,说明该生成绩很差劲,退学吧!对话框输出的背景是黑色的,文字是绿色的,对话框会在用户的面前显示。

    程序运行结果截图:


    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int data;
        printf("请输入一个整数:\n");
        scanf("%d",&data);
        switch(data){
            
            case 0:
                printf("你输入了一个0\n");
                break;
            case 1:
                printf("你输入了一个1\n");
                break;
            case 2:
                printf("你输入了一个2\n");
                break;
            case 3:
                printf("你输入了一个3\n");
                break;
            case 4:
                printf("你输入了一个4\n");
                break;
            default:
                printf("请输入0-4中的任意整数\n");
           }
           
        system("color 2");
        system("pause");
        return 0;
    }

    第4段代码是Switch-case语句的案例。Switch语句是一个程序运行的判断条件,case是该条件下的不同情况,例如这段代码是当用户输入整数之后,12345……通过用户输入的整数来判断用户输入的数字范围在哪一块,程序大体的框架是,用户先定义一个数字变量,然后通过 printf函数输入任意一个整数,scanf函数来扫描数据获得数据的值,此时,switch语句来判断用户输入的整数,因为用户输入的整数范围是01234这几种情况,如果用户输入的不是01234,那么对话框给用户提示,请输入0~4的任意整数。

    Switch和case语句语法结构是这样的,switch判断条件真假的开关,case是该条件下的一些情况,需要注意在case语句下要输入break,如果不输入break的话,程序会存在问题,输入任意一个数字,它永远执行的是第1个,所以在第1个条件判断处要输入break,后面的判断条件类似,因为break语法作用是中途中止某一段程序运行。

    程序运行结果截图:

     


    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int data;
        printf("请输入一个整数:\n");
        scanf("%d",&data);
        switch(data){
            
            case 0:
            case 1:
            case 2:
            case 3:
                printf("你输入了一个0-3范围内的数\n");
                break;
                
            case 4:
                printf("你输入了一个4\n");
                break;
            default:
                printf("请输入0-4中的任意整数\n");
                break;
           }
           
        system("color 2");
        system("pause");
        return 0;
    }

    所谓case语句的另一个变形方式是这样的,用户输入0~3之间的数,做一个统一的条件判断,此时对话框会提示用户输入的是一个0~3范围之内的数,当用户输入整数4,对话框会出现用户输入的数字,此外,default语句是判断语法逻辑错误的,如果说。用户输入除0~4以外的数,那么对话框会提示用户要输入0~4之间的任意整数。
    同样,这里用system函数改变对话框的文字颜色。

    程序运行结果截图:


     

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        int a;//定义为钱的数量
        int b;//定义为房子的数量
      
        printf("Please input some money:\n");
        scanf("%d",&a);
        printf("请输入你的房子套数:\n");
        scanf("%d",&b);
       
        if (a >= 100)
        {
            if(b <= 2)
            {
                 printf("你有钱,但是房子数量不够,我们不合适。\n");
            }
            else
            {
                 printf("我可以jia给你。\n");
            }
        }else
        {
                 printf("gun!\n");
        }


        system("pause");
        return 0;
    }

    该段代码总觉得适合看,不适合解释,不过这样的代码框架搭建得非常沃野,值得学习,可以移植嫁接到其他情境当中。本段代码主要是if-else的嵌套循环。

    程序运行结果截图:

  • 您还可以看一下 刘城龙老师的教你快速查找电脑中的文件课程中的 快速按文件内容查找文件的方法小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    对于该问题,我无法给出具体的解决方案,因为缺少相关代码和错误信息。但是,从问题描述来看,可能是存储文件的代码出现了问题。可以检查是否正确打开文件、是否使用了正确的文件名、是否使用正确的写入方式等等。另外,也可以考虑使用调试工具来帮助定位问题所在。

建议把代码贴上来,图片太小了,看的太累了。
先把代码整理了,明天再看。
代码整体修改完善如下,改动处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#define LEN sizeof(struct book)
#define FORMAT "%-20d %-20s %-20s %-20s %-20s %-20s %-13.2f\n"
#define DATA  bk[i].num,bk[i].bname,bk[i].aname,bk[i].Cnum,bk[i].unit,bk[i].time,bk[i].price
struct book { //10
    int  num; //登录号
    char bname[20]; //书名
    char aname[20]; //作者名
    char Cnum[10]; //分类号
    char unit[20]; //单位
    char time[20]; //出版时间
    float price; //价格  //float price[10]  修改
};
struct book bk[50];
// --函数声明
void input();
void search();
void modify();
void del();
void show(int m = 0);  // 修改
// 定义菜单功能
void menu()
{
    system("cls"); //30
    printf("\t\t|-------------图书管理系统----------|\n");
    printf("\t\t| |\n");
    printf("\t\t|\t 0. 退出系统\t\t\t|\n");
    printf("\t\t|\t 1. 录入图书记录\t\t\t|\n");
    printf("\t\t|\t 2. 查找图书记录\t\t\t|\n");
    printf("\t\t|\t 3. 删除图书记录\t\t\t|\n");
    printf("\t\t|\t 4. 修改图书记录\t\t\t|\n");
    printf("\t\t|\t 5. 记录图书排序\t\t\t|\n");
    printf("\t\t|\t 6. 显示图书记录\t\t\t|\n");
    printf("\t\t|---------------------------------------|\n\n");
    printf("\t\t请输入您的操作(0-6):");
}
// 录入图书信息 
void input()
{
    int i, m = 0, flg;
    char ch[2];
    FILE* fp;
    if ((fp = fopen("bkData.txt", "rb")) == NULL) //fopen("bkData", "a+")  修改
    {
        printf("打开文件失败\n");
        //return; //50   修改
    }
    else {  // 修改
        while (1)  //while (!feof(fp))  修改
        {
            if (fread(&bk[m], LEN, 1, fp) == 1)
                m++; /*统计当前记录条数*/
            else
                break;
        }
        fclose(fp);
    }// 修改
    if (m == 0)
        printf("没有数据!\n");
    else {
        system("cls");
        show(m); // 修改
    }
    printf("是否要录入新信息,请确认(y/n):");
    scanf("%s", ch);
    getchar();
    while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) /*判断是否要录入新信息*/
    {
        do {                                //修改
            printf("登录号:");
            scanf("%d", &bk[m].num);
            for (i = 0, flg = 1; flg && i < m; i++)
                if (bk[i].num == bk[m].num) //80 
                {
                    printf("登录号已存在,请重新输入");
                    flg = 0;
                }
        } while (!flg);                    //修改  
        printf("图书名:");
        scanf("%s", bk[m].bname); //scanf("%s", &bk[m].bname);  修改
        getchar();
        printf("作者名:"); //90 
        scanf("%s", bk[m].aname);//scanf("%s", &bk[m].aname);   修改
        getchar();
        printf("分类号:");
        scanf("%s", bk[m].Cnum); //scanf("%s", &bk[m].Cnum);    修改
        getchar();
        printf("出版单位:");
        scanf("%s", bk[m].unit);//scanf("%s", &bk[m].unit);     修改
        getchar();
        printf("出版时间:");
        scanf("%s", bk[m].time); // scanf("%s", &bk[m].time);   修改
        getchar(); 
        printf("价格:");
        scanf("%f", &bk[m].price);
        m++;
        printf("是否继续?(y/n):"); /*询问是否继续*/
        scanf("%s", ch);
        getchar();
    }
    if (m) {
        if ((fp = fopen("bkData.txt", "wb")) == NULL)
        {
            printf("打开文件失败\n");
            return;
        }
        for (i = 0; i < m; i++)
        {
            fwrite(&bk[i], LEN, 1, fp); /*向指定的磁盘文件写入信息*/
        }
        fclose(fp);
    }
    printf("操作成功!\n");
}
// 查找图书信息 
void search()
{
    FILE* fp;
    int bnum, i, m = 0;
    char ch[2]; //120 
    if ((fp = fopen("bkData.txt", "rb")) == NULL)
    {
        printf("打开文件失败");
        return;
    }
    while (1)  // 修改
    {
        if (fread(&bk[m], LEN, 1, fp) == 1)
            m++; /*统计当前记录条数*/
        else  // 修改
            break;
    }
    fclose(fp);
    if (m == 0) //130 
    {
        printf("文件无记录\n");
        return;
    }
    printf("请输入需要查找的图书的登录号");//135 
    scanf("%d", &bnum); //136 
    for (i = 0; i < m; i++)
        if (bnum == bk[i].num) // 查找输入的登录号是否在记录中 
        {
            printf("图书数据已找到,确认显示?(y/n)");
            scanf("%s", ch);
            if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
            {
                printf(" 登录号 书名 作者名 分类号 单位 出版时间 价格\t\n");
                printf(FORMAT, DATA); /*将查找出的结果按指定格式输出*/
                break;
            }
        }
    if (i == m)
        printf("查找失败!\n"); /*未找到要查找的信息*/
}
// 删除图书信息 
void del()
{
    FILE* fp;
    int bnum, i, j, m = 0;
    char ch[2];
    if ((fp = fopen("bkData.txt", "rb")) == NULL)
    {
        printf("打开文件失败\n");
        return;
    }
    while (1)  // 修改
    {
        if (fread(&bk[m], LEN, 1, fp) == 1)
            m++; /*统计当前记录条数*/
        else  // 修改
            break;
    }
    fclose(fp);
    if (m == 0)
    {
        printf("文件无记录!\n");
        return;
    }
    show(m); /*显示已有数据*/
    printf("请输入需要删除的图书登录号:");
    scanf("%d", &bnum);
    for (i = 0; i < m; i++)
    {
        if (bnum == bk[i].num) /*查找到输入的登录号*/
        {
            printf("数据已找到,是否确认删除?(y/n)");
            scanf("%s", ch);
            if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) /*判断是否要进行删除*/
            {
                for (j = i; j < m - 1; j++); // 修改
                    bk[j] = bk[j + 1];
                m--; /*记录的总个数减1*/
                if ((fp = fopen("bkData.txt", "wb")) == NULL)
                {
                    printf("打开文件失败\n");
                    return;
                }
                for (j = 0; j < m; j++)/*将更改后的记录重新写入指定的磁盘文件中*/
                    if (fwrite(&bk[j], LEN, 1, fp) != 1)
                    {
                        printf("对不起,保存失败!\n");
                        getch(); /*程序暂停*/
                    }
                fclose(fp);
                printf("删除成功!\n");
                return;
            } //200 
            else /*用户输入的字符不是y或Y,表示取消删除*/
            {
                printf("取消删除!\n");
                return;
            }
        }
    }
    printf("没有找到要删除的信息!\n");
}
// 修改图书信息 
void modify()
{
    FILE* fp;
    int i, j, m = 0, bnum;
    if ((fp = fopen("bkData.txt", "rb")) == NULL)
    {
        printf("打开文件失败\n");
        return;
    }
    while (1)  // 修改
    {
        if (fread(&bk[m], LEN, 1, fp) == 1)
            m++; /*统计当前记录条数*/
        else  // 修改
            break;
    }
    fclose(fp);
    if (m == 0)
    {
        printf("文件无记录!\n");
        return;
    }
    show(m);
    printf("请输入你要修改的图书的登录号是:\n");
    scanf("%d", &bnum);
    for (i = 0; i < m; i++)
    {
        if (bnum == bk[i].num) /*检索记录中是否有要修改的信息*/
        {
            printf("图书数据已找到,请修改!\n");
            printf("书  名:");
            scanf("%s", bk[i].bname); /*输入名字*/
            getchar();
            printf("作者名:");
            scanf("%s", bk[i].aname); //scanf("%s", &bk[m].aname);
            getchar();
            printf("分类号:"); 
            scanf("%s", bk[i].Cnum); //scanf("%s", &bk[m].Cnum);
            getchar();
            printf("出版单位:");
            scanf("%s", bk[i].unit); //scanf("%s", &bk[m].unit);
            getchar();
            printf("出版时间:");
            scanf("%s", bk[i].time); //scanf("%s", &bk[m].time);
            getchar();
            printf("价格:");
            scanf("%f", &bk[i].price); 
            printf("modify successful!"); // 248
            if ((fp = fopen("bkData.txt", "wb")) == NULL)
            {
                printf("打开文件失败\n");
                return;
            }
            for (j = 0; j < m; j++) /*将新修改的信息写入指定的磁盘文件中*/
                if (fwrite(&bk[j], LEN, 1, fp) != 1)
                {
                    printf("保存失败!");
                    getch();
                }
            fclose(fp);
            return;
        }
    }
    printf("没有找到匹配信息!\n");
}
void show(int m)
{
    FILE* fp; 
    int   i;
    if (!m) {  //  修改
        if ((fp = fopen("bkData.txt", "rb")) == NULL)
            printf("文件打开失败!\n");
        else {
            while (1) //while (!feof(fp))
            {
                if (fread(&bk[m], LEN, 1, fp) == 1)
                    m++;
                else
                    break;
            }
            fclose(fp);
        }
    }
    if (m) {  //  修改
        printf(" 登录号 书名 作者名 分类号 单位 出版时间 价格\t\n");
        for (i = 0; i < m; i++)
            printf(FORMAT, DATA); /*将学生信息按指定格式打印*/
    }
    else
        printf("文件无记录!\n"); //修改
}
void order() //排序 
{
    FILE* fp;
    struct book t;
    int i = 0, j = 0, m = 0;
    if ((fp = fopen("bkData.txt", "rb")) == NULL) //if ((fp = fopen("bkData.txt", "r+"))
    {
        printf("打开文件失败!\n");
        return;
    }
    while (1)  // 修改
    {
        if (fread(&bk[m], LEN, 1, fp) == 1)
            m++; /*统计当前记录条数*/
        else  // 修改
            break;
    }
    fclose(fp);
    if (m == 0)
    {
        printf("无记录!\n");
        return;
    }
    for (i = 0; i < m - 1; i++)
        for (j = i + 1; j < m; j++) /*双重循环实现成绩比较并交换*/
            if (strcmp(bk[i].Cnum, bk[j].Cnum) < 0) //if (bk[i].Cnum < bk[j].Cnum) 修改
            {
                t = bk[i]; bk[i] = bk[j]; bk[j] = t;
            }
    if ((fp = fopen("bkData.txt", "wb")) == NULL)
    {
        printf("打开文件失败\n"); 
    }
    else {
        for (j = 0; j < m; j++) /*将新修改的信息写入指定的磁盘文件中*/
            if (fwrite(&bk[j], LEN, 1, fp) != 1)
                printf("保存失败!");
        fclose(fp);
        printf("排序成功!\n");
    }
}
// 主函数 
int main()
{
    int n;
    menu();
    scanf("%d", &n);
    while (n)
    {
        switch (n) {
        case 0: exit(0);
        case 1: input(); break;
        case 2: search();break;
        case 3: del();   break;
        case 4: modify();break; /*修改记录功能函数调用*/
        case 5: order(); break; /*删除记录功能函数调用*/
        case 6: show();  break;
        }
        getch();
        menu();
        scanf("%d", &n);
    }
    return 0;
}