사용한 개발 툴 : fedora core10 vi편집기
2009년 4월 9일

문제] 프로그램3.4는 레코드를 입력 순서대로 저장하는데, 이 프로그램을 수정해서 각 레코드가 레코드 번호 위치에 저장되도록 하라. 프로그램은 다음 조건을 만족시킨다.

(1) 전체 레코드 수는 100 으로 하고, 초기화시에 전체 레코드의 used 필드를 0으로 한다.

(2) 추가되는 레코드 번호는 사용자로부터 입력받는다.

즉, add_record() 함수에서 (레코드 번호, 이름, 주소)를 입력받는다.

(3) 각 레코드는 파일의 레코드 번호 위치에 저장된다.

즉, 레코드1은 파일의 첫 번째에 저장되고, 레코드5는 파일의 다섯 번째에 저장된다.

(4) garb_collect() 함수는 더 이상 필요없으므로 제거한다.

<파일 생성>

if ((fd = open(DB_FILE, O_RDWR|O_CREAT, 0644)) < 0) {

printf("file (%s) creation failed\n", DB_FILE);
exit(0);//파일 생성
recode_init(fd);

}

else if ((fd = open(DB_FILE, O_RDWR, 0644)) < 0) {

printf("file (%s) file write failed\n", DB_FILE);
exit(0);// 파일이 있는 경우 쓰기;

}

void recode_init(int fd)//전체 레코드 만들기 
{

int i =0;
lseek(fd, 0L, SEEK_SET);
for(i=0; i<RECORD; i++){ //레코드 100개 생성
mb.used =0; // 초기화
write(fd, &mb, sizeof mb);

}

void add_record(int fd) {

int recno,i;
char cho; // y/n 여부 저장
get_no:
printf("recode no : ");
fscanf(stdin,"%d", &recno );
__fpurge(stdin);
if(recno<1 || recno>RECORD){ //예외처리 

error_message(); 
printf("(1~100)\n\n\n" );
goto get_no;

}

lseek(fd, 0L, SEEK_SET);
while(read(fd, &mb, sizeof mb)> 0){

i++;
if(recno == mb.used){

printf("%3d 레코드에는 이미 정보가 있습니다.\n", recno);
printf("덮어 쓰시겠습니까(y/n)?");
fscanf(stdin, "%c", &cho);
__fpurge(stdin);
if(cho == 'n'|| cho == 'N' ){ 

goto get_no; 

}

}



mb.used = recno; 
recno--; 
lseek(fd, recno*(sizeof mb), SEEK_SET);
get_name:
printf("name : ");
fgets(mb.name, LEN_NAME, stdin);
if(strlen(mb.name)>LEN_NAME){//예외처리

error_message(); 
__fpurge(stdin);
goto get_name;



mb.name[strlen(mb.name)-1] = '\0'; 
printf("address : ");
fgets(mb.address, LEN_ADDRESS, stdin);
mb.address[strlen(mb.address)-1] = '\0';
lseek(fd, recno*(sizeof mb), SEEK_SET);
write(fd, &mb, sizeof mb);

}

void del_record(int fd) {

int recno;
printf("record no ");
fscanf(stdin, "%d", &recno);
recno--;
__fpurge(stdin);
lseek(fd, recno*(sizeof mb), SEEK_SET);
if (read(fd, &mb, sizeof mb) <= 0) {

printf("no such record\n");
return;

}
mb.used = 0;
lseek(fd, recno*(sizeof mb), SEEK_SET);
write(fd, &mb, sizeof mb);

}


Posted by 검지발가락♡