반응형
SMALL

8.3.3 순차 파일의 레코드 추가

> 레코드 추가를 위한 사용 모드

 

a, a+, ab, ab+

- 형식 : fp = fopen('파일명", "a");

- 사용 예 : fp = fopen("samlpe.dat", "a");

- 기능 : 이미 만들어진 순차파일의 끝에 새로운 레코드 추가(append)

 

//레코드 추가의 사용 예

#include <stdio.h>

void main(){
     FILE *fp;

     fp = fopen("sample4.txt", "a");

     fputs("Cho DS \n", fp);

     fputs("Han JK \n", fp);

     fputs("Kang MH \n", fp);

     fclose(fp);  } 

 

 

 

 

8.4 랜덤 파일 random file 처리 

- 파일의 임의의 위치에서 자료를 읽거나 쓸 수 있다.

- 레코드의 길이가 일정

 

> 순차파일에 비해

- 단점 : 기억공간 낭비

- 장점 : 레코드 검색이 빠르고 효과적

 

8.4.1 랜덤 파일 열기

 

일반적으로 랜덤파일을 입출력할 때는 2진 모드로 파일을 개방

fopen("파일 이름", "wb")

fopen("파일 이름", "rb")

 

2진 모드의 특징

- 텍스트 파일보다 적은 기억공간

- 레코드의 길이를 프로그래머가 결정

- 파일 포인터의 위치 변경 가능

 

8.4.2 랜덤 파일 만들기

(1) fwrite() 함수

- 형식 : fwrite(저장 자료 변수, 레코드 길이, 레코드 개수, 파일 포인터);

- 사용 예 : fwrite(name, 10, 1, fp);

 

- 레코드의 길이를 지정

- 자료저장 변수는 포인터 형

 

//fwrite() 함수의 사용 예

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void main(){

   FILE *fp;

   char  name[10];

   if((fp = fopen("sample5.dat", "wb"))==NULL){
 // sample5.dat 파일을 2진 파일 쓰기 모드로 개방                     // sample5.dat 파일이 생성됨

   put("파일을 개방할 수 없습니다!");

   exit(1);   }

   printf("이름을 입력하시오. 입력을 끝내려면 'END'를 입력하시오. \n");

   gets(name);

   while(strcmp(name, "END")){  // 입력 문자열이 END가 아닐 동안 loop 계속

      fwrite(name, 10, 1, fp);       // 2진 파일에 쓰기

      gets(name); }  fclose(fp); } 

 

 

8.4.3 랜덤 파일 읽기

(1) fread() 함수

- 형식 : fread(읽을 자료변수, 레코드 길이, 레코드 개수, 파일 포인터);

- 사용 예 : fread(name, 10, 1, fp);

- 읽기에 성공하면 레코드 수를 리턴

 

// fread() 함수의 사용 예

#include <stdio.h>

#include <stdlib.h>

void main(){

   FILE *fp;

   char name[10];

   if((fp=fopen("sample5.dat", "rb"))==NULL){

// sample5.dat 파일을 2진 파일 읽기 모드로 개방                     // 파일읽어 오기

      puts("파일을 개방할 수 없습니다!");

      exit(1); }

   while(1){

     if(fread(name, 10, 1, fp) != 1)

// 레코드의 개수가 1이므로 1이 아닌 값이 리턴되면 (즉, 파일의 끝이므로) while문을 벗어남

        break;

     puts(name);   }  fclose(fp);    }

 

 

8.4.4 랜덤 파일의 위치 제어

(1) fseek() 함수의 사용 

 > 파일 포인터를 임의의 위치로 이동시키는 함수

 > 랜덤파일의 특정부분을 입출력할 수 있다.

 

- 형식 : fseek(파일포인터 변수, 이동할 상대위치, 기준위치를 지정하는 모드);

- 사용 예 : fseek(fp, 2*REC_size, SEEK_SEK):

> 기준 위치로부터 앞, 뒤로 이동하는 상대위치 개념 사용

fseek() 함수의 기준위치 지정모드

--- stdio.h에 정의됨

 

 

 

 

** fseek() 함수에 대한 그림 표현 

// fseek() 함수의 사용 예 

#include <stdio.h>

#include <string.h>

void main(){
   char str[10];

   FILE *fp = fopen("sample6.txt", "wt");

   fputs("1234567890", fp);

   fclose(fp);

   fp = fopen("sample6.txt", "rt");

   fseek(fp, 7, SEEK_SET);

   fgets(str, 4, fp);

   printf("7번째부터 3글자 출력 : %s \n", str);

   fseek(fp, -2, SEEK_CUR);

   fgets(str, 3, fp);

   printf("현재 위치에서 앞의 2글자부터 2글자 출력 : %s \n", str);

   fseek(fp, -9, SEEK_END);

   fgets(str, 6, fp);

   printf("맨 뒤에서 9번째 앞부터 5글자 출력 : %s \n", str);

   fclose(fp);  }

 

(2) ftell() 함수의 사용 

ftell() 함수는 현재 파일 위치 지시자가 포인트하는 곳이 파일의 처음부터 몇 바이트 떨어진 곳인지를 알려 준다.

- 형식 : ftell(파일 포인터 변수):

- 사용 예 : ftell(fp);

 

//ftell() 함수의 사용 예

#include <stdio.h>

void main(){

   long pos;

   int i;

   FILE *fp = fopen("sample7.txt", "wt");

   fputs("1234#", fp);   // 파일에 문자열 쓰기

   fclose(fp);

   fp = fopen("sample7.txt", "rt");

   for(i=0; i<4; i++){

      putchar(fgetc(fp));     // 파일로부터 한 글자씩 읽어 화면에 출력

      pos = ftell(fp);          // 현재 파일 위치 지시자 정보를 변수 pos에 저장

      fseek(fp, -1, SEEK_END);

      putchar(fgetc(fp));

      fseek(fp, pos, SEEK_SET);  } fclose(fp);   }  

// 저장해 놓은 정보를 참조하여 파일 위치자를 이전 위치로 되돌림

 

반응형
LIST

+ Recent posts