检查 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相反,即使它你也必须手动过滤行尾。