Language/C C언어 강좌 (임의 접근/시스템 레벨 입출력)
  • 728x90
    반응형

     

     

     

    C언어 Chapter 32.


     

     

     

    임의 접근

    • 지금까지의 파일의 입출력은 파일의 처음부터 끝까지 순차적으로 읽거나 쓰는 것이었다.
    • fseek()함수를 이용하면 파일 내의 임의의 위치에 바로 접근할 수 있다.

     

    📌 fseek() 함수의 원형

    int fseek(FILE *fp, long offset, int origin);

     

    • origin 부터 offset 만큼 떨어진 부분을 찾는다.
    • origin 는 기준점 이다.

     

    [origin 의 값]

     

    🔔 예)

    fseek(fp, 35L, SEEK_SET);

     

    • 파일의 시작점에서 35바이트 떨어진 위치가 파일 내 현재의 위치도 설정 된다.
    • 여기서부터 읽거나 쓸 수 있다.
    • fseek() 함수는 성공이면 0을 반환한다.
    • ftell() 함수는 현재파일 내의 읽기 점이나 쓰기 점을 반환한다. (파일내의 현재 위치 표시)

    long ftell(FILE *fp);

     

    • 실패할 경우 -1L을 반환한다. (type 이 long 인 이유는 파일 크기의 한계를 최대한 늘려주기 위함)
    • 임의접근은 2진형식의 파일을 사용할 때 유용하다.

     

    🔔 예) 데이터 파일의 두 번째 줄을 화면과 파일에 출력하는 프로그램

     

    <11-8.in 내부>

     

    실행 결과

     

     

     

    시스템 레벨 입출력

    • 저수준 입출력은 표준입출력 함수에 비해 프로그램 코드가 짧으며 실행 속도가 빠르다.
      (자주 호출되면 시스템 전체가 느려질 수 있다.)

    int open(char *filename, int oflag, int pmode);

    int close(int fd);

     

    • oflag : 읽을 것인가 쓸것인가.
    • pmode : 실행, 읽기, 쓰기
    • oflag는 파일번호 순서대로 3~… 을 반환한다.

     

    [oflag 파일의 접근방법은 <fcntl.h>에 다음 표와 같이 정의되어있다.]

     

     

    • 여러 개의 값을 주어야 하는경우 비트OR 연산자( | )를 사용한다.

    🔔 예)

    O_RDONLY | O_BINARY

     

    • 그러나 읽기 전용과 쓰기 전용을 동시에 표시할 수는 없다.
    • 파일 핸들(=descriptor) : 저수준 입출력에서는 파일 포인터를 사용하지 않고 핸들(handle) 이라고 부르는 파일기술자를 사용하여 파일에 대한 연산이 이루어진다.
    • 핸들 값은 open() 함수의 반환 값으로 양의 정수 값이다.
    • open()함수는 오류가 발생할 경우 -1 을 반환한다.

     

    [표준입출력 장치의 파일 핸들]

     

    • pmode : 마지막 인수 pmode는 보통 생략되며 새로운 파일을 만들기 위해서 O_CREAT를 사용했을 때 새로운 파일에 대한 접근 허가를 명시할 때 사용한다.

     

    [pmode의 정의]

     

    • pmode를 사용하기 위해서는 #include 를 사용하여 <sys/types.h>파일과 <sys/stat.h> 파일을 포함시켜야한다.
      (도스는 역 슬러쉬(\))
    • 새로운 파일을 작성할때는 creat()를 사용할수 있다.

    int creat(char *filename, int pmode);

     

    • creat()함수는 실패시 -1을 반환

     

    [read()/write() 함수]

    int read(int fd, char *buffer, int size);

    int write(int fd, char *buffer, int size);

     

    • 파일핸들 fd가 가리키는 파일에서 size크기 만큼의 바이트를 buffer로 읽어온다.
    • 성공하면 읽은 바이트 수를 반환하고, EOF이고 0을, 오류가 발생 하면 -1을 반환한다.
    • 버퍼의 크기가 커지면 스택 오버플로우가 일어날수 있으므로 전역변수로 선언해 주어야 한다.

     

     

    🔔 예) 입력 데이터 파일의 내용을 새로운 출력파일을 생성하여 복사하는프로그램

     

    🎯 프로그램 설명

    • FILE 이름을 #define 정의 형식과 포인터로 가르키는 형식 두가지를 모두 보여주고 있다.

     

    <d11-9.in 파일내부>

     

     

    실행 결과

     

     

     

    <실행 후d11-9.out 파일내부>

     

     

     

     

    728x90
    반응형
상단으로