【发布时间】:2021-02-21 09:26:49
【问题描述】:
我正在尝试用 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();
}
【问题讨论】:
-
不起作用信息量不大。你能描述一系列能够重现问题的动作吗?你会得到更好的答案,更快...
-
顺便说一句,这段代码中充斥着对不相关库 (
gotoxy)、特定编译器扩展(fflush(stdin)仅在 Microsoft 标准库上有效)和几乎已弃用的gets的调用。不是一个真正的niceminimal reproducible example...如果这个问题离我在这里找到的最糟糕的问题还很远,但它可以在很大程度上得到改善。 -
嗯.. 什么是
duplicateInfo?如当前所问,这个问题无法回答,因为我们无法复制该问题。 -
gotoxy 工作正常,gets 也能正常工作。它正确地从用户那里获取值,并且 duplicateInfo 是一个仅在屏幕上打印输出的函数..如果 ISBN 不存在,它将显示 ISBN 不存在
-
@Waleed 等一晚。:)
标签: c file duplicates file-handling