0

我已经使用文件创建了一个数据库。如果文件中已经存在记录,则在文件中插入记录时,它将最终被复制。但我想避免这种情况。如何设计一种机制来避免重复记录(即如何检查记录是否已经在文件中以及如何阻止用户在文件中再次输入相同的数据)?

/*  vehicle record program      */

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

typedef struct vehicle
{
    char name[100];
    int lice_no;
    int vehicle_type;
    char cmpny_name[100];
    int menu_year;
}record;

int main(void)
{
    int i , choice;
    FILE *fp1,*fp2;
    char oname[100];
    record det;
    int recsize;
    char c;

    fp1 = fopen("record.dat" , "r+");
    if(fp1 == NULL)
    {
        fp1 = fopen("record.dat" , "w+");
        if(fp1 == NULL)
        {
            printf("error in opening file : \n");
            return -1;
        }
    }
    recsize = sizeof(det);

    fseek(fp1 , 0 ,SEEK_END);
    printf("Enter owner Name    : ");
    scanf("%[^\n]" , det.name);
    printf("Enter licence number    : ");
    scanf("%d" , &det.lice_no);
    printf("Enter the vehicle type  : ");
    scanf("%d" , &det.vehicle_type);
    scanf("%c" , &c);
    printf("Enter company name  : ");
    scanf("%[^\n]" , det.cmpny_name);
    printf("Enter menufecture year  : ");
    scanf("%d" , &det.menu_year);
    fwrite(&det,recsize,1,fp1);
}
4

1 回答 1

2

在插入新记录之前,您必须检查文件中是否已经存在相同的记录。为了做到这一点,我将从创建几个函数开始。就像是:

void find_record(char *name, record *rec, FILE *f);
void add_record(const record *rec, FILE *f);
void del_record(char *name, FILE *f);

我假设name仅此一项就可以识别给定的记录。否则,您将需要使用复合键(例如name+ lice_no)。

一旦你拥有了所有这些功能,防止重复记录就变得容易多了:

void add_record(const record *rec, FILE *f) {
    ...
    record *r;
    find_record(rec->name, r, f);
    if (r == NULL) {
        // record is not already in the file -> insert it
        ...
    }
    else {
        // record is already in the file -> do nothing
        printf("A record with name %s already exists\n", r->name);
    }
    ...
}

如您所见,以模块化方式编程确实有很大帮助,并使事情变得更容易。

于 2012-05-28T11:39:01.250 回答