【问题标题】:Check duplicate record in C l not working检查 C l 中的重复记录不起作用
【发布时间】: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


【解决方案1】:

看起来你在同一个文件上使用了两种不同大小的记录:

  • 在研究重复项时,您会阅读大小为sizeof(struct check) 的记录
  • 添加新书时,您写入大小为sizeof(struct library) 的记录

这足以产生不一致的读取。


众所周知,使用gets 会导致许多问题:如果用户无意中输入了超过 99 个字符,则会导致缓冲区溢出...我强烈建议您使用 fgets,即使您有手动过滤行尾。

【讨论】:

  • 你是对的。我的问题是我使用了两个结构。一个用来读,一个用来写。谢谢大佬
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2013-07-18
  • 2015-09-12
相关资源
最近更新 更多