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 に答える