파일을 융통성 있고 빠르게 처리하려면 지금까지 살펴본 입출력 함수 대신에 프로그래머가 버퍼와 카운터, 파일 포인터를 직접 서술하는 저수준의 입출력 함수를 취급해야 한다. 저수준에서 파일은 파일명 대신에 파일 서술자(handle)로 관찰하는데 이는 정수로 표기된다. 이들 저수준 입출력 함수는 헤더파일 <io.h>에 포함되어 있다.
 
■ open()과 close()
 
      int  open(char *file, int oflag, int permission);
      int  close(int handle);
 
open() 함수는 파일을 읽거나 쓰기 위하여 어떻게 준비하고 허가모드를 무엇으로 할 것인지를 정하는 함수로서 반환값은 정수이다. 반환값은 물리적 파일에 대응되는 논리적 파일명이다. 따라서 물리적 파일은 프로그램 안에서 논리적 번호로 처리한다. 이때 handle은 파일명 대신 사용되는 파일 서술자 번호이고, oflag는 파일을 취급하는 연산모드이고, permission은 파일의 허가모드이다. oflag와 permission에 여러 모드를 허용하기 위해서 비트 논리연산자 OR로 다중서술 할 수 있다. open() 함수의 모드값을 사용하려면 헤더파일 <fcntl.h>나, <systypes.h>, <sysstat.h>을 프로그램에 포함시켜야 한다.  
여기서는 oflag와 permission의 기본 모드만을 살펴보기로 한다. 허가모드는 oflag가 O_CREAT인 경우에만 서술될 수 있다.
       연   산   모   드
      허  가  모  드
   O_RDWR   : 읽고 쓰기 위해
   O_CREAT  : 생성하고 쓰기 위해
   O_BINARY : 이진모드로 열기 위해
   O_APPEND : 파일 끝에 쓰기 위해
   O_RDONLY : 오직 읽기 위해
   O_WRONLY : 오직 쓰기 위해
   S_IWRITE:  쓰기허가
   S_IREAD :  읽기허가
   S_IREAD | S_IWRITE:
              읽고 쓰기 허가
 
 
   close() 함수는 handle에 연결된 파일을 닫는데 성공하면 0을, 실패하면 -1을 반환한다.
 
■ read()와 write()
 
     int  read(int handle, char *buffer, unsigned int count);
     int  write(int handle, char *buffer, unsigned int count);
 
read()는 handle에 관계되는 파일로부터 count에 해당하는 바이트만큼 읽어서 buffer에 기억시키는 함수이다. 읽은 후에 파일 포인터는 읽은 마지막 문자 다음에 위치한다. 읽을 때 정상이면 읽은 문자수를, 파일 끝에 이르면 0을, 오류의 경우에는 -1을 반환한다.
write()는 buffer로부터 handle에 관계된 파일에 count에 해당하는 바이트만큼 쓰는 함수로서 기록한 후에 파일 포인터는 파일 끝에 위치한다. 쓸 때 정상이면 기록한 문자의 수가 반환되고, 오류가 발생하면 -1을 반환한다.
 
■ lseek()
 
     long  lseek(inr  handle, long  offset, int  pos);
 
lseek()는 handle에 관계되는 파일의 pos 위치로부터 offset 바이트만큼 새로운 위치로 파일 포인터를 옮기는 함수이다. 이때 pos는 파일의 시작(0 또는 SEEK_SET), 파일의 끝(2 또는 SEEK_END) 또는 파일 포인터의 현 위치(1 또는 SEEK_CUR) 중 하나에 속한다.
 
■ eof()
 
      int  eof(int  handle);
 
eof()는 파일을 읽을때 파일의 끝에 도달했는지를 결정하는 함수로서 반환값은 파일 끝일때 1, 정상적인 상태인 경우에는 0, 오류시에는 -1이다. handle은 논리적 파일에 해당하는 번호이다.
 
       /* 입출력함수 getc(), putc(), getw(), putw(), fgets(), fputs()를 사용한 프로그램 */
main(int argc, char  *argv[])
{     FILE  *fpi, *fpo, *fopen();
       char ch, cha, buf[80];
       int   wort, value;
       if (argc != 3)
       {     printf("두개의 파일 이름을 작성하시오!n");
              exit(1);
       }
       fpi=fopen(argv[1], "r");
       fpo=fopen(argv[2], "w+");
 
       /* getc() / putc() */
       ch=getc(fpi);
       while (ch != EOF)  {  
             putc(ch, fpo);    
             ch=getc(fpi);
       }
 
       /* getw() / putw() */
       while ((wort=getw(fpi))!=EOF)
             putw(wort, fpo);
 
       /* fgets() / fputs() */
       while ( fgets(buf, 80, fpi))
             fputs(buf, fpo);
  }
 
 /* 저수준 함수 fseek(), lseek(), fputc(), fgetc(), write(), read(), open(),  fopen()들을
            이용하는 프로그램 */
#include <io.h>
#include <fcntl.h>
main(void)  {
      char  c, cc[2];
      int  i, handle;
      FILE  *ofil;
      /* 파일 TEST_1을 출력용으로 열고 알파벧 문자를 ofil에 기록 */
      ofil=fopen("TEST_1", "w+b");
      for (c='A'; c <= 'Z'; c++)
             fputc(c, ofil);
 
      /* 파일 포인터를 처음부터 10번째 위치로 이동한 후에   */
      /* 현 위치부터 3문자를 fgetc()로 읽어서 모니터로 출력  */
      fseek(ofil, 10, SEEK_SET);  /* SEEK_SET은 0에 해당 */
      for (i=0; i < 3; i++)
             printf("n%c", fgetc(ofil));
      fclose(ofil);
 
      /* 파일 TEST_2를 I/O용으로 생성하고 포인터를 시작점에 둔다 */
      /* 파일 TEST_2에 A - Z까지 문자를 출력  */
      handle=open("TEST_2", O_RDWR | O_CREAT);
      for (c='A'; c<='Z'; c++)
             write(handle, &c, 1);    /* handle에 해당하는 파일의 20번째 위치부터 3 문자를 출력 */
      lseek(handle, 20, SEEK_SET);
      for (i=0; i < 3; i++)
      {     read(handle, cc, 1);
             printf("n%s", cc);
      }
      close(handle);
}
 
 
Posted by 용학도리
,