[UNIX] 저수준, 고수준 파일 입출력

Taegang Yun·2023년 10월 4일
1

Unix 프로그래밍

목록 보기
7/19

저수준 파일 입출력

파일 기술자 복사: dup()

int dup(int oldfd);

  • oldfd : 복사할 파일 기술자

파일 기술자의 복사는 입출력 방향 전환에 많이 사용된다.

int dup2(int oldfd, int newfd);

  • oldfd : 복사할 파일 기술자
  • newfd : 파일 기술자를 복사할 곳

파일 기술자 제어 : fcntl

int fcntl(int fd, int cmd, ... arg ...);

  • fd : 파일 기술자

  • cmd : 명령

  • arg : cmd에 따라 필요시 지정하는 인자들

  • F_GETFL : 상태 플래그 정보를 읽어옴

  • F_SETFL : 상태 플래그 정보를 설정, 설정할 수 있는 것은 대부분 open() 함수에서 지정하는 플래그

파일 삭제 : remove()

int remove(const char *pathname);

파일 디스크 동기화

int fsync(int fd);


고수준 파일 입출력

  • 열린 파일을 가리킬 때 고수준 파일 입출력에서는 파일 포인터를 사용한다.
  • 파일 포인터는 디스크에서 메모리를 읽어온 파일의 위치(주소)에 관한 정보를 담고 있는 포인터
  • 파일 기술자는 정수형이지만 파일 포인터는 시스템 헤더 파일에 정의되어 있는 FILE 포인터

파일 열기 : fopen()

FILE fopen(const char pathname, const char *mode)

  • pathname : 파일의 경로
  • mode : 파일 열기 모드
FILE *fp;
fp = fopen("test.txt", "r");

이 경우 text.txt 파일을 읽기 전용으로 열고 파일 포인터 주소를 포인터 변수인 fp에 저장

파일 닫기 : fclose()

int fclose(FILE *stream)

  • stream : fopen() 에서 리턴한 파일 포인터
FILE *fp;
fp = fopen("test.txt", "r");
fclose(fp);

문자 기반 입력 함수 : fgetc(), getc(), getchar(), getw()

  • stream : 파일 포인터

  • fgetc(), getc(), getchar(), getw() 함수의 특징

  • fgetc( ) 함수: 파일 포인터가 가리키는 파일로부터 문자 한 개를 unsigned char 형태로 읽어옴

  • getc() 함수: 매크로로 구현되어 있어 실행 속도는 약간 빠르지만 실행 코드가 확장되므로 메모리를 조금 더 차지
    그 외에는 fgetc() 함수와 동일한 기능을 수행

  • getchar() 함수: 표준 입력에서 문자 한 개를 읽어오는 매크로로, getc(stdin)과 같음

  • getw() 함수는 파일에서 워드 단위로 읽음, 워드의 크기는 int형의 크기로 시스템에 따라 달라짐

문자 기반 출력 함수 : fputc(), putc(), putchar(), putw()

  • c, w : 출력할 문자
  • stream : 파일 포인터

문자열 기반 입력 함수 : gets(), fgets()

char *gets(const char *s);
char *fgets(char *s, int size, FILE *stream);
  • s : 문자열을 저장한 버퍼의 시작 주소
  • size : 버퍼의 크기
  • stream : 파일 포인터

문자열 기반 출력 함수 : puts(), fputs()

  • puts() 함수의 특징
    s가 가리키는 문자열을 표준 출력으로 출력, 이때 개행 문자를 추가해 출력

  • fputs() 함수의 특징
    s가 가리키는 문자열을 파일 포인터가 가리키는 파일로 출력
    출력할 때 개행 문자를 추가하지 않는다. 두 함수 모두 성공하면 음수가 아닌 수를 리턴하고, 파일의 끝이면 오류를 리턴

버퍼 기반 입력 함수 : fread()

size_t fread(void ptr, size_t size, size_t nmemb, FILE stream);

  • ptr : 버퍼 주소
  • size : 버퍼 크기
  • nmemb : 읽어올 항목 수
  • stream : 파일 포인터

항목의 크기가 size인 데이터를 nmemb 에서 지정한 개수만큼 읽어 ptr이 가리키는 버퍼에 저장.
성공적으로 수행하면 읽어온 항목 수를 리턴
읽을 항목이 없으면 0을 파일의 끝을 만나면 EOF를 리턴

버퍼 기반 출력 함수 : fwrite()

size_t fwrite(const void ptr, size_t size, size_t nmemb, FILE stream);

  • ptr : 버퍼 주소
  • size : 항목의 크기
  • nmemb : 항목 수
  • stream : 파일 포인터

항목의 크기가 size인 데이터를 nmemb에서 지정한 개수만큼 ptr에서 읽어 stream 으로 지정한 파일에 출력

성공적으로 수행하면 출력한 항목의 수를, 오류가 발생 하면 EOF 를 리턴

형식 기반 입력 함수 : scanf(), fscanf()

int scanf(const char *format)
int fscanf(FILE stream, const char format, ...);

  • format : 입력 형식(%d, %s 등)
  • stream : 파일 포인터

파일 오프셋 이동 : fseek()

int fseek(FILE *stream, long offset, int whence);

  • stream : 파일 포인터
  • offset : 이동할 오프셋
  • whence : 오프셋의 기준 위치

현재 오프셋 구하기 : ftell()

long ftell (FILE *stream)

  • stream : 파일 포인터

처음 위치로 오프셋 이동 : rewind()

void rewind(FILE *stream)

오프셋 위치를 파일의 시작으로 즉시 이동

파일과 디스크 동기화 함수 : fflush()

int fflush(FILE *stream)

파일 기술자와 파일 포인터 변환

profile
언젠간 전문가가 되겠지

0개의 댓글