检查 C l 中的重复记录不起作用
Check duplicate record in C l not working
我正在尝试用 C 语言制作一个图书馆管理系统。我正在检查是否有重复的 ISBN 号,这样用户就不能添加两本具有相同 ISBN 号的书。这段代码在昨晚工作。它正确地检查了文件中重复的 ISBN 号。但是现在我今天早上检查了一下,它没有用。我不明白这段代码有什么问题。我觉得一切都很好
struct check {
char isbn_no[100];
};
struct library {
char book_name[100];
char publisher_name[100];
char author_name[100];
char no_of_copies[100];
char date_of_issue[100];
char isbn_no[100];
};
void add_book() {
char info;
int duplicate = 0;
FILE *bd;
struct library bk;
struct check isbnNoCheck;
system("cls");
if((bd = fopen("bookdetails.bin", "ab+")) == NULL) {
printf(" Error opening file");
exit(1);
}
gotoxy(0, 1);
printf(" UOS Library Management System\n");
gotoxy(0, 4);
printf(" Add New Book (Please add required information in the appropriate fields)\n");
gotoxy(0, 5);
printf(" ------------------------------------------------------------------------\n");
fflush(stdin);
gotoxy(0, 7);
printf(" Book Name: ");
gets(bk.book_name);
printf("\n Book ISBN Number: ");
gets(bk.isbn_no);
printf("\n Publisher Name: ");
gets(bk.publisher_name);
printf("\n Author Name: ");
gets(bk.author_name);
printf("\n Number of Copies: ");
gets(bk.no_of_copies);
printf("\n Date of Issue: ");
gets(bk.date_of_issue);
while(fread(&isbnNoCheck, sizeof(isbnNoCheck), 1, bd) == 1) {
if(strcmp(isbnNoCheck.isbn_no, bk.isbn_no) == 0) {
duplicate = 1;
}
}
printf("%d", duplicate);
printf("\n Do you want to add book informantion (Y/N): ");
scanf("%c", &info);
printf(" \n--------------------------------------------------------------------------");
if(info == 'Y') {
if(duplicate == 1) {
fclose(bd);
duplicateInfo(duplicate);
printf("exists");
}
if(duplicate == 0) {
fwrite(&bk, sizeof(bk), 1, bd);
fclose(bd);
duplicateInfo(duplicate);
}
}
fclose(bd);
getch();
}
看起来你在同一个文件上使用了两种不同大小的记录:
- 在搜索重复项时,您读取了大小为
sizeof(struct check)
的记录
- 添加新书时,您写了一条大小为
sizeof(struct library)
的记录
这足以导致读取不一致。
众所周知,使用 gets
会导致许多问题:如果用户无意中输入了 99 个以上的字符,您将导致缓冲区溢出...我强烈建议您使用 fgets
相反,即使它你也必须手动过滤行尾。
我正在尝试用 C 语言制作一个图书馆管理系统。我正在检查是否有重复的 ISBN 号,这样用户就不能添加两本具有相同 ISBN 号的书。这段代码在昨晚工作。它正确地检查了文件中重复的 ISBN 号。但是现在我今天早上检查了一下,它没有用。我不明白这段代码有什么问题。我觉得一切都很好
struct check {
char isbn_no[100];
};
struct library {
char book_name[100];
char publisher_name[100];
char author_name[100];
char no_of_copies[100];
char date_of_issue[100];
char isbn_no[100];
};
void add_book() {
char info;
int duplicate = 0;
FILE *bd;
struct library bk;
struct check isbnNoCheck;
system("cls");
if((bd = fopen("bookdetails.bin", "ab+")) == NULL) {
printf(" Error opening file");
exit(1);
}
gotoxy(0, 1);
printf(" UOS Library Management System\n");
gotoxy(0, 4);
printf(" Add New Book (Please add required information in the appropriate fields)\n");
gotoxy(0, 5);
printf(" ------------------------------------------------------------------------\n");
fflush(stdin);
gotoxy(0, 7);
printf(" Book Name: ");
gets(bk.book_name);
printf("\n Book ISBN Number: ");
gets(bk.isbn_no);
printf("\n Publisher Name: ");
gets(bk.publisher_name);
printf("\n Author Name: ");
gets(bk.author_name);
printf("\n Number of Copies: ");
gets(bk.no_of_copies);
printf("\n Date of Issue: ");
gets(bk.date_of_issue);
while(fread(&isbnNoCheck, sizeof(isbnNoCheck), 1, bd) == 1) {
if(strcmp(isbnNoCheck.isbn_no, bk.isbn_no) == 0) {
duplicate = 1;
}
}
printf("%d", duplicate);
printf("\n Do you want to add book informantion (Y/N): ");
scanf("%c", &info);
printf(" \n--------------------------------------------------------------------------");
if(info == 'Y') {
if(duplicate == 1) {
fclose(bd);
duplicateInfo(duplicate);
printf("exists");
}
if(duplicate == 0) {
fwrite(&bk, sizeof(bk), 1, bd);
fclose(bd);
duplicateInfo(duplicate);
}
}
fclose(bd);
getch();
}
看起来你在同一个文件上使用了两种不同大小的记录:
- 在搜索重复项时,您读取了大小为
sizeof(struct check)
的记录
- 添加新书时,您写了一条大小为
sizeof(struct library)
的记录
这足以导致读取不一致。
众所周知,使用 gets
会导致许多问题:如果用户无意中输入了 99 个以上的字符,您将导致缓冲区溢出...我强烈建议您使用 fgets
相反,即使它你也必须手动过滤行尾。