Dev

표준 입출력 함수 메모

April 23, 2018

표준 입출력 함수 메모

바이트 스트림과 관련된 시스템 콜(open, close, read, write, seek)을 감싸는 표준 입출력 함수에 대해서 정리

open

FILE 은 내부에 버퍼를 가지고 있어서 (매우 느린) 시스템 콜 호출 횟수를 줄여줌.

  • FILE *fopen(const char *path, const char *mode);

close

  • int fclose(FILE *stream);

read

int를 반환하는 함수는 스트림 종료(EOF)를 알려주기 위해서 char가 아닌 int를 사용.

  • int fgetc(FILE *stream);
    • 한 문지를 읽어옴
  • int getc(FILE *stream);
    • fgetc의 매크로 버전.
  • int getchar(void);
    • getc(stdin)
  • char *fgets(char *str, int size, FILE *stream);
    • 개행 문자나 EOF 를 만날때까지의 값을 가져옴. 또는 size – 1 만큼을 가져오면 str 에 반환.
    • 개행 문자를 포함해서 돌려줌.
    • 읽지 못하면 NULL을 반환.
  • char *gets(char *str);
    • 사용 비추천. 가져올 수 있는 최대 길이가 지정되어 있지 않기 때문에 buffer overflow 의 가능성이 있음.
  • size_t fread(void *buf, size_t size, size_t nmemb, FILE *stream);
    • 고정 길이의 바이트열을 읽어옴.
    • 문자열일 것이라고 기대하지 않으므로 필요하다면 \0을 직접 써야함.

write

char를 받아야 하는데 int를 받는 이유는, fgetc에서 넘겨받은 결과를 그대로 넘겨줄 수 있도록 하기 위해서.

  • int fputc(int c, FILE *stream);
    • 반환값은 쓴 바이트 수. 실패하면 EOF
  • int putc(int c, FILE *stream);
    • fputc의 매크로 버전
  • int putchar(int c);
    • putc(stdout)
  • int fputs(const char *buf, FILE *stream);
    • 한 줄을 출력하는 함수가 아님(fgets와 비대칭)
    • 전부 쓰거나 / 실패하면 EOF -> 구분하려면 쓰기 전에 errno를 초기화해둘 것. 실패하는 경우에만 errno가 변경됨.
  • int puts(const char *buf);
    • stdout에 buf를 출력 + 개행문자를 출력.
  • int printf(const char *fmt, …);
    • fmt에 지정된 형식과 그 뒤로 넘겨받은 인수들을 이용해 출력.
    • 넘겨받은 fmt에 인자 없는 치환문자 %가 포함되어 있으면 망할 수 있음.
  • int fprintf(FILE *stream, const char *fmt, …);
    • stream 지정 가능판
  • size_t fread(const void *buf, size_t size, size_t nmemb, FILE *stream);
    • 고정 길이의 바이트열을 씀.
  • int fseek(FILE *stream, long offset, int whence);
    • 파일 위치 인디케이터 위치 변경
  • int fseeko(FILE *stream, off_t offset, int whence);
    • 32-bit long 으로 표시할 수 없는 경우를 위한 확장판
  • int ftell(FILE *stream);
    • stream의 파일 위치 인디케이터 반환.
  • off_t ftello(FILE *stream);
    • 32-bit long 으로 표시할 수 없는 경우를 위한 확장판
  • void rewind(FILE *stream);

Misc

  • int fileno(FILE *stream);
    • stream이 감싸고 있는 파일 디스크립터를 반환
  • FILE *fdopen(int fd, cosnt char *mode);
    • 파일 디스크립터를 감싸는 FILE 구조체를 생성 & 반환
  • int feof(FILE *stream);
    • EOF 플래그 상태를 반환
  • int ferror(FILE *stream);
    • 에러 플래그를 반환
  • void clearerr(FILE *stream);
    • EOF / 에러 플래그를 초기화.
  • int ungetc(int c, FILE *stream);
    • 바이트 c를 스트림으로 돌려보냄.
    • 1바이트 이상은 돌려보낼 수 없음.

Reference

ふつうのLinuxプログラミング