2012-05-28 3 views
0

파일을 사용하여 데이터베이스를 만들었습니다. 파일에 레코드가 이미있는 경우 파일에 레코드를 삽입하면 결국 중복됩니다. 그러나 저는 그것을 피하고 싶습니다. 레코드 복제 방지 (예 : 레코드가 파일에 이미 있는지 확인하는 방법 및 사용자가 파일에 다시 입력 한 동일한 데이터를 중지하는 방법)를 설계하려면 어떻게해야합니까?C 언어로 파일 작업을 사용하여 데이터베이스 만들기

/* 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

실제로 입력 한 내 기록이 파일에 있는지 확인하고 싶습니다. –

+0

간단한 예를 만들 수 있습니까? 그것은 너무 많은 코드입니다. 더 정확한 질문을하면 좋을 것입니다. 그것은 분명하지 않습니다. – betabandido

+0

'main()'에 모든 것을 넣는 대신에 몇 가지 함수를 만들 수도 있습니다. – betabandido

답변

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); 
    } 
    ... 
} 

당신이 볼 수있는 바와 같이, 모듈 방식의 프로그래밍은 정말 많은 도움이, 사물이 훨씬 쉬워집니다.

+0

파일에서 레코드를 찾는 방법 ... –

+1

파일 포인터를 (fseek를 사용하여) 이동해야합니다 처음에는 원하는 파일을 찾을 때까지 모든 파일을 탐색하기 시작합니다. 하나의 레코드에서 다른 레코드로 이동하려면'fseek'를 다시 사용하여'sizeof (record)'바이트를 점프해야합니다. 추가로 [색인] (http://en.wikipedia.org/wiki/Database_index)이 있으면 주어진 레코드를 찾는 것이 훨씬 쉽고 빠릅니다. 그러나 이것은 프로그램의 복잡성을 현저하게 증가시킬 것이므로 미래에 남겨 둘 수 있습니다. – betabandido

+0

BTW, 각 작업에 대해 파일을 열고 닫는 대신 프로그램 시작시 한 번만 열면 프로그램을 끝내기 직전에 닫는 것이 좋습니다. 그래서 필자는 필자의 대답에 모든 함수에'FILE * f'라는 매개 변수를 포함 시켰습니다. – betabandido

관련 문제