新手关于图书管理系统调试不通过的疑问

时间:2022-11-27 17:44:57
编译可以运行,但是在显示文件内容时显示的是乱码,看了很多遍,没找到是read_file、write_file、还是display函数有问题,请求大神试运行一下并指正其中的错误!

//图书管理系统

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

#define MAXTITL 40
#define MAXAUTL 40
#define MAXBKS 10

int count=0;

struct book
{
char title[MAXTITL];             //图书标题
char author[MAXAUTL];            //图书作者
double value;                    //图书价格
};

void read_file(struct book *p,char *filename); //将文件内容读取到结构中
void display(struct book *p);                  //显示文件内容
void reduce_book(struct book *p);              //删除某个图书
void add_book(struct book *p);                 //添加图书
void change_book(struct book *p);              //更改图书
void write_file(struct book *p,char *filename);//将结构数据写入文件

int main(void)
{
char choice[10];                           //存放用户选择字符串
struct book library[MAXBKS];

printf("Please enter your choice:\n");
printf("d: display the book      a: add the book\n");
printf("c: change the book       r: reduce the book\n");
printf("q: save and quit\n");

read_file(library,"book.dat");
display(library);
gets(choice);
while(choice[0]!='q')
{
switch(choice[0])
{
case 'r':
reduce_book(library);
break;
case 'd':
display(library);
break;
case 'a':
add_book(library);
break;
case 'c':
change_book(library);
break;
}
printf("Please enter your choice:\n");
printf("d: display the book      a: add the book\n");
printf("c: change the book       r: reduce the book\n");
printf("q: save and quit\n");
gets(choice);
}
write_file(library,"book.dat");
printf("完成\n");

return 0;
}

void read_file(struct book *p,char *filename)
{
FILE *fp;
int size=sizeof(struct book);

if((fp=fopen(filename,"a+b"))==NULL)
{
printf("文件打开失败!\n");
exit(1);
}
rewind(fp);                       //将指针定位到文件开始
while(count<MAXBKS && fread(p+count,size,1,fp)==1)
{
count++;
}
fclose(fp);
}
void reduce_book(struct book *p)
{
int i;
char name[MAXTITL];

printf("Please enter the title you want delete.\n");
gets(name);
for(i=0;i<count;i++)
{
if(strcmp(p[i].title,name)==0)
{
p[i]=p[count-1];
strcpy(p[count-1].title,"");
strcpy(p[count-1].author,"");
p[count-1].value=0;
count--;
}
else
printf("No %s\n",name);
}
}
void add_book(struct book *p)
{
if(count<MAXBKS-1)
{
count++;
printf("Please add new book titles:");
gets(p[count].title);
printf("Now enter the auther:");
gets(p[count].author);
printf("Now enter the value:");
scanf("%lf",&p[count].value);
while(getchar()!='\n')
continue;
}
else
{
printf("The book.dat file is full.\n");
exit(1);
}
}
void display(struct book *p)
{
int i;
if(count>0)
{
printf("Here is your list:\n");
for(i=0;i<count;i++)
{
printf("%s by %s :$ %.2lf\n",p[i].title,p[i].author,p[i].value);
}
}
else
printf("No books.\n");
}
void change_book(struct book *p)
{
int i;
char name[MAXTITL];

printf("Please enter the title of book:");
gets(name);
for(i=0;i<count;i++)
{
if(strcmp(p[i].title,name)==0)
{
printf("Now enter the new title:");
gets(p[i].title);
printf("Now enter the new auther:");
gets(p[i].author);
printf("Now enter the new value:");
scanf("%lf",&p[i].value);
while(getchar()!='\n')                //清除多余字符
continue;
}
else
printf("No %s\n",name);
}
}
void write_file(struct book *p,char *filename)
{
int size;
FILE *fp;

size=sizeof(struct book);
fp=fopen(filename,"wb");//将文件以可写模式打开,目的是清空文件内容
fp=fopen(filename,"r+b");
fwrite(p,size,count,fp);
fclose(fp);
}

4 个解决方案

#1


struct book library[MAXBKS];

#2



struct book library[MAXBKS];
memset(library, 0, sizeof(library));



void add_book(struct book *p)
{
    if(count<MAXBKS-1)
    {
         //count++;
        printf("Please add new book titles:");
        gets(p[count].title);
        printf("Now enter the auther:");
        gets(p[count].author);
        printf("Now enter the value:");
        scanf("%lf",&p[count].value);
        while(getchar()!='\n')
            continue;
         count++;
    }
    else
    {
        printf("The book.dat file is full.\n");
        exit(1);
    }
}

#3


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#4


想知道哪里的问题为何不单步跟踪程序运行,观察每一步结果是否与你预期一致,以快速找到原因

#1


struct book library[MAXBKS];

#2



struct book library[MAXBKS];
memset(library, 0, sizeof(library));



void add_book(struct book *p)
{
    if(count<MAXBKS-1)
    {
         //count++;
        printf("Please add new book titles:");
        gets(p[count].title);
        printf("Now enter the auther:");
        gets(p[count].author);
        printf("Now enter the value:");
        scanf("%lf",&p[count].value);
        while(getchar()!='\n')
            continue;
         count++;
    }
    else
    {
        printf("The book.dat file is full.\n");
        exit(1);
    }
}

#3


代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#4


想知道哪里的问题为何不单步跟踪程序运行,观察每一步结果是否与你预期一致,以快速找到原因