我使用文件创建了一个数据库。如果文件中已存在记录,则在文件中插入记录时,最终会重复记录。但我想避免这种情况。如何设计一种机制来避免重复记录(即,如何检查记录是否已经存在于文件中以及如何停止用户在文件中再次输入相同的数据)?
/* 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);
}
答案 0 :(得分: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);
}
...
}
正如您所看到的,以模块化方式进行编程确实有很大帮助,并使事情变得更加容易。