표준 입출력 함수 메모
바이트 스트림과 관련된 시스템 콜(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);
- 고정 길이의 바이트열을 씀.
position indicator related
- 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
Array