在图书管理系统中遇到的困难,望高手指点!!!急!!!!!

时间:2022-11-27 17:44:45
这是我写的关于图书管理系统,基本上是可以运行的,但有一个错误是:当我选一时程序就会自己跳出如下错误 Debug Assertion Failed!
program:D:\Debug\bookmanager.exe
File: fopen.c
Line:54

expression: *file != _T('\0')
For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)

这是为什么?望高手指点!
以下是源程序:

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

void creat();
void read();
void save();
void insert();
void deleter();
void change();
void sort();

#define FORMAT "%"

int n=0;
FILE *fp;

struct book{
int id;
char name[20];
char author[20];
char press[20];
float price;
int count;
}bk[100];
struct book *p;

void creat()
{
char filename[20];
printf("请输入filename:");
gets(filename);
fp=fopen(filename,"wb+");
printf("已成功建立数据库文件。\n\n");
fclose(fp);
}

void read()
{
char filename[20];
printf("\n请输入filename:");
gets(filename);
if((fp=fopen(filename,"rb"))==NULL){
printf("输入有误,不存在该文件!!\n\n");
return;
}
do{
if(fread(&bk[n],sizeof(struct book),1,fp)!=1){
if(feof(fp)) 
printf("文件读取成功!");
else printf("文件读取失败!");
}
}while(1);
//fclose(fp);
}

void save()
{
int i;
char filename[20];
printf("请输入要保存的文件名。");
gets(filename);
if((fp=fopen(filename,"wb"))==NULL){
printf("不能保存文件!");
return;
}
else{
for(i=0;i<n;i++)
if(fwrite(&bk[i],sizeof(struct book),1,fp)!=1)
printf("文件保存错误!");
fclose(fp);
}
}

void insert()
{
char c;
do{
printf("\n请输入图书的书号:");
scanf("%d",&bk[n].id);
printf("请输入书名:");
scanf("%s",bk[n].name);
printf("请输入作者:");
scanf("%s",bk[n].author);
printf("请输入出版社:");
scanf("%s",bk[n].press);
printf("请输入价格:");
scanf("%f",&bk[n].price);
printf("请输入书的数目");
scanf("%d",&bk[n].count);
getchar();
n++;
printf("继续录入?(按y继续,其他退出)");
c=getchar();
printf("\n");
}while(c=='y'||c=='Y');
printf("数据已成功输入!\n");
}

void deleter()
{
int id,i,flag=1;
printf("请输入图书号:");
scanf("%d",&id);
for(i=0;i<n;i++)
if(bk[i].id==id)
bk[i]=bk[n-1],n--,flag=0;
if(flag)
printf("输入有误,不存在该书的数据!!\n");
printf("\t已成功删除该书的数据!");
}

void change()
{
int i,id;
char c;
printf("请输入要更改的图书的书号:");
scanf("%d",&id);
do{
for(i=0;i<n;i++)
if(bk[i].id==id){
    printf("\n请输入图书的书号:");
    scanf("%d",&bk[n].id);
    printf("请输入书名:");
    scanf("%s",bk[n].name);
    printf("请输入作者:");
    scanf("%s",bk[n].author);
    printf("请输入出版社:");
    scanf("%s",bk[n].press);
    printf("请输入价格:");
    scanf("%f",&bk[n].price);
    printf("请输入书的数目");
        scanf("%d",&bk[n].count);
}
getchar();
printf("继续更改吗?");
c=getchar();
}while(c=='y'||c=='Y');
printf("数据已成功更改!\n");
}



void sort()
{
int i,j;
struct book temp;
for(i=0;i<n-2;i++)
for(j=0;j<=n-2-i;j++)
if(bk[j].id<bk[j+1].id){
temp=bk[j];
bk[j]=bk[j+1];
bk[j+1]=temp;
}
}

int main()
{
int s;
do{
system("cls");
printf("***************************************************\n");
printf("***           欢迎使用图书管理系统              ***\n");
printf("***           1.创建新的数据文件                ***\n");
printf("***           2.读入数据                        ***\n");
printf("***           3.保存数据                        ***\n");
printf("***           4.插入数据                        ***\n");
printf("***           5.删除数据                        ***\n");
printf("***           6.更改数据                        ***\n");
printf("***           7.对数据进行排序                  ***\n");
printf("***           8.退出                            ***\n");
printf("***************************************************\n");
scanf("%d",&s);
switch(s){
case 1 : creat(); 
case 2 : read(); 
case 3 : save(); 
case 4 : insert(); 
case 5 : deleter(); 
case 6 : change(); 
case 7 : sort(); 
//case 8 : exit(-1); break;
default : s=9;
}
}while (s==9);
return 0;
}









13 个解决方案

#1


将gets(filename)改为scanf("%s", filename)就好了.

#2



printf("请输入filename:");
fflush(stdin);

#3


为什么会出现在以上情况?
我改了,果然可以,谢谢
不过又出现另一个问题:如果我选四,当输完图书数据时会出现以下错误:
Debug Error!
Program: D:\Debug\bookmanager.exe

runtime error
(Press Retry to debug the application)

#4


老实说,你的程序在输入输出上的漏洞很多,不是一时可以改完的

#5


这我也知道,所以应该慢慢改,我也是刚刚开始编程的,有一点点的进步都是非常令人兴慰的!
谢谢!帮忙看看

#6



   使用 scanf("%s",bk[n].name); 函数时注意不能在输入的过程中含有空格
   
   简单的演示程序可使用gets(str)用来读取输入,该函数不支持对str的边界检查,
   你可以把结构中的字符串定的长一些.

   c=getchar(); 中的函数使用了行缓冲读取,不适合交互环境使用,
   可以改成
   c = getch();
   加入include <conio.h>引用即可. 该函数不回显字符,立即返回,不需要回车.

   每次调用 scanf()或gets()函数之前调用 
   fflush(stdin);清空控制台输入缓冲;

   注意检查自己的输入是否越界...

   

#7


越界了!

#8


up

#9


getchar() 与 getch() 有什么区别?
谁有比较完整的源程序给小弟参考一下,谢谢!
只要达到插入,修改,删除,排序的目的。

#10


我把程序又改了一下,请高手帮忙看
现在遇到的一个问题是:当我运行插入函数时,当输入最后一个数据也就是书数量,就跳出错误,
要向微软发送错误信息,我晕
帮忙看看!!!小弟先谢了!

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

void creat();
void read();
void save();
void insert();
void deleter();
void change();
void sort();
void print();

#define FORMAT "%"

int n=0;
FILE *fp;

struct book{
int id;
char name[20];
char author[20];
char press[20];
float price;
int count;
}bk[100];
struct book *p;

void print()
{
printf("书号  书名  作者  出版社  价格  数量\n");
for(p=bk;p<=bk+n;p++){
printf("%-8d%-8s%-8s%-10s%-8.1f%-6d\n",p->id,p->name,p->author,p->press,p->price,p->count);
}
}

void read()
{
n=0;
if((fp=fopen("bok.txt","rb"))==NULL){
printf("输入有误,不存在该文件!!\n\n");
return;
}
do{
if(fread(&bk[n],sizeof(struct book),1,fp)!=1){
if(feof(fp)){ 
print();
printf("文件读取成功!\n");
printf("press any key to continue!");
getch();
return;
}
else printf("文件读取失败!");
}
n++;
}while(1);
fclose(fp);
}

void save()
{
int i;
if((fp=fopen("bok.txt","wb"))==NULL){
printf("不能保存文件!");
return;
}
else{
for(i=0;i<n;i++)
if(fwrite(&bk[i],sizeof(struct book),1,fp)!=1)
printf("文件保存成功!");
fclose(fp);
}
}

void insert()
{
char c,d;
int t,a,i,j=0;
struct book temp;
read();
  /*printf("Please enter the number for insert: ");
  scanf("%d", &n);
  for(i=0; i<m; i++)
   if(n==student[i].number)
   {
      j=i+1;
            printf("Number: %d  Name: %s  Sex: %s  Age: %d  Score: %d Address: %s \n",student[i].number, student[i].name, student[i].sex,student[i].age, student[i].score, student[i].addr);
       }
       if(j==0)
       {
         printf("No this record.");
         break;
       }
       fflush(stdin);
       printf("Insert behind number %d ?(y/n): ", n);
       scanf("%c",&c);
       if (c=='n' || c=='N')
           continue;
       temp=student[j];
       printf("Number: ");
       scanf("%d", &student[j].number);
       printf("Name: ");
       scanf("%s", student[j].name);
       printf("Sex: ");
       scanf("%s", student[j].sex);
       printf("Age:\n");
       scanf("%d", &student[j].age);
       printf("Score: ");
       scanf("%d", &student[j].score);
       printf("Address: ");
       scanf("%s", student[j].addr);
       for(t=m+1; t>j; t--)
       {student[t+1]=student[t];
       }
       student[j+1]=temp;
       fflush(stdin);
       printf("Do you want to insert continue?(y/n): ");
       scanf("%c",&c);
   }while ( c== 'y' || c== 'Y' );*/
do{
fflush(stdin);
printf("请输入要在后面插入的图书号:");
        scanf("%d",&a);
for(i=0;i<n;i++)
if(bk[i].id==a)j=i+1;
if(j==0){
printf("不存在该纪录!");
getch();
break;
}
fflush(stdin);
printf("你确认要在%d后插入吗?(y/n)",a);
    scanf("%c",&d);
if(d=='n'||d=='N') continue;
temp=bk[j];
    printf("\n请输入图书的书号:");
    scanf("%d",&bk[j].id);
    printf("请输入书名:");
    scanf("%s",bk[j].name);
    printf("请输入作者:");
    scanf("%s",bk[j].author);
    printf("请输入出版社:");
    scanf("%s",bk[j].press);
    printf("请输入价格:");
    scanf("%f",&bk[j].price);
    printf("请输入书的数目");
        scanf("%d",&bk[j].count);
    for(i=n+1;i>j;i--)
bk[i+1]=bk[t];
bk[i+1]=temp;
    n++;
printf("继续录入?(按y继续,其他退出)");
    c=getchar();
    printf("\n");
}while(c=='y'||c=='Y');
printf("数据已成功输入!\n");
}

void deleter()
{
int id,i,flag=1;
fflush(stdin);
printf("请输入图书号:");
scanf("%d",&id);
for(i=0;i<n;i++)
if(bk[i].id==id){
bk[i]=bk[n-1];
n--;
flag=0;
}
if(flag)
printf("输入有误,不存在该书的数据!!\n");
printf("\t已成功删除该书的数据!");
getchar();
getchar();
}

void change()
{
int i,id;
char c;
printf("请输入要更改的图书的书号:");
scanf("%d",&id);
do{
for(i=0;i<n;i++)
if(bk[i].id==id){
    printf("\n请输入图书的书号:");
    scanf("%d",&bk[n].id);
    printf("请输入书名:");
    scanf("%s",bk[n].name);
    printf("请输入作者:");
    scanf("%s",bk[n].author);
    printf("请输入出版社:");
    scanf("%s",bk[n].press);
    printf("请输入价格:");
    scanf("%f",&bk[n].price);
    printf("请输入书的数目");
        scanf("%d",&bk[n].count);
}
else {
printf("不存在的纪录!");
getchar();
break;
}
printf("继续更改吗?");
c=getchar();
}while(c=='y'||c=='Y');
printf("数据已成功更改!\n");
}



void sort()
{
int i,j;
struct book temp;
for(i=0;i<n-2;i++)
for(j=0;j<=n-2-i;j++)
if(bk[j].id<bk[j+1].id){
temp=bk[j];
bk[j]=bk[j+1];
bk[j+1]=temp;
}
}

int main()
{
int s;
do{
system("cls");
printf("***************************************************\n");
printf("***           欢迎使用图书管理系统              ***\n");
printf("***           2.读入数据                        ***\n");
printf("***           3.保存数据                        ***\n");
printf("***           4.插入数据                        ***\n");
printf("***           5.删除数据                        ***\n");
printf("***           6.更改数据                        ***\n");
printf("***           7.对数据进行排序                  ***\n");
printf("***           8.退出                            ***\n");
printf("***************************************************\n");
printf("请输入你的选择:");
scanf("%d",&s);
switch(s){
case 2 : read(); break;
case 3 : save(); break;
case 4 : insert(); break;
case 5 : deleter(); break;
case 6 : change(); break;
case 7 : sort(); break;
}
}while (s!=8);
return 0;
}

#11


里面有一段是没用的。

#12


UP

#13


改用C++来写^_^

#1


将gets(filename)改为scanf("%s", filename)就好了.

#2



printf("请输入filename:");
fflush(stdin);

#3


为什么会出现在以上情况?
我改了,果然可以,谢谢
不过又出现另一个问题:如果我选四,当输完图书数据时会出现以下错误:
Debug Error!
Program: D:\Debug\bookmanager.exe

runtime error
(Press Retry to debug the application)

#4


老实说,你的程序在输入输出上的漏洞很多,不是一时可以改完的

#5


这我也知道,所以应该慢慢改,我也是刚刚开始编程的,有一点点的进步都是非常令人兴慰的!
谢谢!帮忙看看

#6



   使用 scanf("%s",bk[n].name); 函数时注意不能在输入的过程中含有空格
   
   简单的演示程序可使用gets(str)用来读取输入,该函数不支持对str的边界检查,
   你可以把结构中的字符串定的长一些.

   c=getchar(); 中的函数使用了行缓冲读取,不适合交互环境使用,
   可以改成
   c = getch();
   加入include <conio.h>引用即可. 该函数不回显字符,立即返回,不需要回车.

   每次调用 scanf()或gets()函数之前调用 
   fflush(stdin);清空控制台输入缓冲;

   注意检查自己的输入是否越界...

   

#7


越界了!

#8


up

#9


getchar() 与 getch() 有什么区别?
谁有比较完整的源程序给小弟参考一下,谢谢!
只要达到插入,修改,删除,排序的目的。

#10


我把程序又改了一下,请高手帮忙看
现在遇到的一个问题是:当我运行插入函数时,当输入最后一个数据也就是书数量,就跳出错误,
要向微软发送错误信息,我晕
帮忙看看!!!小弟先谢了!

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

void creat();
void read();
void save();
void insert();
void deleter();
void change();
void sort();
void print();

#define FORMAT "%"

int n=0;
FILE *fp;

struct book{
int id;
char name[20];
char author[20];
char press[20];
float price;
int count;
}bk[100];
struct book *p;

void print()
{
printf("书号  书名  作者  出版社  价格  数量\n");
for(p=bk;p<=bk+n;p++){
printf("%-8d%-8s%-8s%-10s%-8.1f%-6d\n",p->id,p->name,p->author,p->press,p->price,p->count);
}
}

void read()
{
n=0;
if((fp=fopen("bok.txt","rb"))==NULL){
printf("输入有误,不存在该文件!!\n\n");
return;
}
do{
if(fread(&bk[n],sizeof(struct book),1,fp)!=1){
if(feof(fp)){ 
print();
printf("文件读取成功!\n");
printf("press any key to continue!");
getch();
return;
}
else printf("文件读取失败!");
}
n++;
}while(1);
fclose(fp);
}

void save()
{
int i;
if((fp=fopen("bok.txt","wb"))==NULL){
printf("不能保存文件!");
return;
}
else{
for(i=0;i<n;i++)
if(fwrite(&bk[i],sizeof(struct book),1,fp)!=1)
printf("文件保存成功!");
fclose(fp);
}
}

void insert()
{
char c,d;
int t,a,i,j=0;
struct book temp;
read();
  /*printf("Please enter the number for insert: ");
  scanf("%d", &n);
  for(i=0; i<m; i++)
   if(n==student[i].number)
   {
      j=i+1;
            printf("Number: %d  Name: %s  Sex: %s  Age: %d  Score: %d Address: %s \n",student[i].number, student[i].name, student[i].sex,student[i].age, student[i].score, student[i].addr);
       }
       if(j==0)
       {
         printf("No this record.");
         break;
       }
       fflush(stdin);
       printf("Insert behind number %d ?(y/n): ", n);
       scanf("%c",&c);
       if (c=='n' || c=='N')
           continue;
       temp=student[j];
       printf("Number: ");
       scanf("%d", &student[j].number);
       printf("Name: ");
       scanf("%s", student[j].name);
       printf("Sex: ");
       scanf("%s", student[j].sex);
       printf("Age:\n");
       scanf("%d", &student[j].age);
       printf("Score: ");
       scanf("%d", &student[j].score);
       printf("Address: ");
       scanf("%s", student[j].addr);
       for(t=m+1; t>j; t--)
       {student[t+1]=student[t];
       }
       student[j+1]=temp;
       fflush(stdin);
       printf("Do you want to insert continue?(y/n): ");
       scanf("%c",&c);
   }while ( c== 'y' || c== 'Y' );*/
do{
fflush(stdin);
printf("请输入要在后面插入的图书号:");
        scanf("%d",&a);
for(i=0;i<n;i++)
if(bk[i].id==a)j=i+1;
if(j==0){
printf("不存在该纪录!");
getch();
break;
}
fflush(stdin);
printf("你确认要在%d后插入吗?(y/n)",a);
    scanf("%c",&d);
if(d=='n'||d=='N') continue;
temp=bk[j];
    printf("\n请输入图书的书号:");
    scanf("%d",&bk[j].id);
    printf("请输入书名:");
    scanf("%s",bk[j].name);
    printf("请输入作者:");
    scanf("%s",bk[j].author);
    printf("请输入出版社:");
    scanf("%s",bk[j].press);
    printf("请输入价格:");
    scanf("%f",&bk[j].price);
    printf("请输入书的数目");
        scanf("%d",&bk[j].count);
    for(i=n+1;i>j;i--)
bk[i+1]=bk[t];
bk[i+1]=temp;
    n++;
printf("继续录入?(按y继续,其他退出)");
    c=getchar();
    printf("\n");
}while(c=='y'||c=='Y');
printf("数据已成功输入!\n");
}

void deleter()
{
int id,i,flag=1;
fflush(stdin);
printf("请输入图书号:");
scanf("%d",&id);
for(i=0;i<n;i++)
if(bk[i].id==id){
bk[i]=bk[n-1];
n--;
flag=0;
}
if(flag)
printf("输入有误,不存在该书的数据!!\n");
printf("\t已成功删除该书的数据!");
getchar();
getchar();
}

void change()
{
int i,id;
char c;
printf("请输入要更改的图书的书号:");
scanf("%d",&id);
do{
for(i=0;i<n;i++)
if(bk[i].id==id){
    printf("\n请输入图书的书号:");
    scanf("%d",&bk[n].id);
    printf("请输入书名:");
    scanf("%s",bk[n].name);
    printf("请输入作者:");
    scanf("%s",bk[n].author);
    printf("请输入出版社:");
    scanf("%s",bk[n].press);
    printf("请输入价格:");
    scanf("%f",&bk[n].price);
    printf("请输入书的数目");
        scanf("%d",&bk[n].count);
}
else {
printf("不存在的纪录!");
getchar();
break;
}
printf("继续更改吗?");
c=getchar();
}while(c=='y'||c=='Y');
printf("数据已成功更改!\n");
}



void sort()
{
int i,j;
struct book temp;
for(i=0;i<n-2;i++)
for(j=0;j<=n-2-i;j++)
if(bk[j].id<bk[j+1].id){
temp=bk[j];
bk[j]=bk[j+1];
bk[j+1]=temp;
}
}

int main()
{
int s;
do{
system("cls");
printf("***************************************************\n");
printf("***           欢迎使用图书管理系统              ***\n");
printf("***           2.读入数据                        ***\n");
printf("***           3.保存数据                        ***\n");
printf("***           4.插入数据                        ***\n");
printf("***           5.删除数据                        ***\n");
printf("***           6.更改数据                        ***\n");
printf("***           7.对数据进行排序                  ***\n");
printf("***           8.退出                            ***\n");
printf("***************************************************\n");
printf("请输入你的选择:");
scanf("%d",&s);
switch(s){
case 2 : read(); break;
case 3 : save(); break;
case 4 : insert(); break;
case 5 : deleter(); break;
case 6 : change(); break;
case 7 : sort(); break;
}
}while (s!=8);
return 0;
}

#11


里面有一段是没用的。

#12


UP

#13


改用C++来写^_^