C 파일 입출력

C 표준 라이브러리 프로그래밍 언어 C는 파일 입출력을 위한 많은 표준 라이브러리 기능들을 제공한다. 이 기능들은 대부분 C 표준 라이브러리 헤더 파일 로부터 구성된다.at=p. 274, § 7.19 이 기능들은 1970년대 초반 벨 연구소의 마이크 레스크가 작성한 "휴대용 입출력 패키지"에서 왔으며,page=200 유닉스 버전 7에서 정식으로 운영체제의 한 부분이 되었다.institution=Bell Labs C의 입출력 기능은 현대의 표준의 기준으로 하면 상당이 낮은 수준이다. C는 입력 스트림이나 출력 스트림과 같은 파일에 대한 모든 작업들을 바이트 단위의 흐름으로 추상화한다. 과거의 다른 프로그래밍 언어와는 달리 C는 데이터 파일에 임의 액세스를 하는 기능을 제공하지 않고 대신, 파일 매체 저장소를 읽기 위해 프로그래머가 스트림을 생성해줘야 한다. 파일 매체를 찾고, 스트림에서 바이트 단위로 연속으로 읽는다. 파일 입출력의 스트림 모델은 C 프로그래밍 언어가 개발되었을 때 같이 개발되던 유닉스를 통해 대중화되었다. 수많은 현대 운영체제는 유닉스로부터 스트림을 물려받았으며, C 프로그래밍 언어 계열의 많은 언어들도 C의 파일 입출력 인터페이스를 약간의 수정을 거쳐 물려받았다. (예시 - PHP).
# 개요

## 기능
C 파일 입출력 기능의 대부분은 C 표준 라이브러리 헤더 파일 에 정의되어 있다. (C++의 경우 표준 C 기능을 포함한 헤더 cstdio에 있으며 std 이름공간을 포함해야 함.) {| class="wikitable" |- ! ! 바이트 문자 ! 확장 문자 ! 설명 |- ! rowspan=7 | 파일 접근 | colspan=2 | fopenfopen | 파일 열기(윈도우에선 비-유니코드 파일 이름, 유닉에서는 UTF-8 파일 이름) |- | colspan=2 | freopenfreopen | 존재하는 스트림으로 다른 파일 열기 |- | colspan=2 | fflushfflush | 대응되는 파일로 출력 스트림 동기화하기 |- | colspan=2 | fclosefclose | 파일 닫기 |- | colspan=2 | setbufsetbuf | 파일 스트림에 버퍼 장착시키기 |- | colspan=2 | setvbufsetvbuf | 파일 스트림 크기에 맞게 버퍼 장착 |- | colspan=2 | fwidefwide | 전각 문자와 반각 문자간 파일 스트림 교환 |- ! rowspan=2 | 직접 입출력 | colspan=2 | freadfread | 파일 읽기 |- | colspan=2 | fwritefwrite | 파일 쓰기 |- ! rowspan=9 | 언포맷 입출력 | | getcfgetc
getc | | getwcfgetwc
getwc | 파일 스트림으로부터 바이트/wchar_t 읽기 |- | | fgetsfgets | | fgetwsfgetws | 파일 스트림으로부터 바이트/wchar_t 라인 읽기 |- | | putcfputc
putc | | putwcfputwc
putwc | 파일 스트림에 바이트/wchar_t 쓰기 |- | | fputsfputs | | fputwsfputws | 파일 스트림에 바이트/wchar_t 문자열 입력 |- | | getchargetchar | | getwchargetwchar | 표준 입력으로부터 바이트/wchar_t 입력 |- | | gets~~gets~~ | n/a | 새 줄이 나오거나 파일 끝까지 갈때까지 표준 입력으로부터 바이트 문자열 읽기 (deprecated in C99, C11에서 삭제) |- | | putcharputchar | | putwcharputwchar | 표준 출력으로 바이트/wchar_t 입력 |- | | putsputs | n/a | 표준 출력으로 바이트 문자열 입력 |- | | ungetcungetc | | ungetwcungetwc | 파일 스트림에 바이트/wchar_t 제자리에 돌려놓기 |- ! rowspan=5 | 포맷 입출력 | | sscanfscanf
fscanf
sscanf | | swscanfwscanf
fwscanf
swscanf | 파일 스트림이나 버퍼의 표준 입력으로부터 형식화된 바이트/wchar_t 입력 읽기 |- | | vsscanfvscanf
vfscanf
vsscanf | | svwscanfvwscanf
vfwscanf
vswscanf | 가변 인자 목록을 쓰는 파일 스트림이나 버퍼의 표준 입력으로부터 형식화된 입력 바이트/wchar_t 읽기 |- | | snprintfprintf
fprintf
sprintf
snprintf | | swprintfwprintf
fwprintf
swprintf | 파일 스트림이나 버퍼의 표준 출력으로 형식화된 바이트/wchar_t 출력을 출력하기 |- | | vsnprintfvprintf
vfprintf
vsprintf
vsnprintf | | vswprintfvwprintf
vfwprintf
vswprintfurl=http://en.cppreference.com/w/c/io/vswprintf | 가변 인자 목록을 쓰는 파일 스트림이나 버퍼의 표준 출력으로 형식화된 바이트/wchar_t 출력을 출력 |- | | perrorperror | n/a | 표준 에러에 현재 에러 설명 쓰기 |- ! rowspan=5 | 파일 위치 조정 | colspan=2 | ftellftell
ftello | 현재 파일 포인터 되돌려주기 |- | colspan=2 | fseekfseek
fseeko | 파일의 특정 위치로 파일 포인터 이동 |- | colspan=2 | fgetposfgetpos | 파일 포인터 얻기 |- | colspan=2 | fsetposfsetpos | 파일의 특정 위치로 파일 포인터 이동 |- | colspan=2 | rewindrewind | 파일 포인터를 파일의 첫 시작 부분으로 이동 |- ! rowspan=3 | 에러 조작 | colspan=2 | clearerrclearerr | 에러 삭제 |- | colspan=2 | feoffeof | 파일의 끝 체크 |- | colspan=2 | ferrorferror | 파일 에러 체크 |- ! rowspan=4 | 파일 조작 명령 | colspan=2 | removeremove | 파일 삭제 |- | colspan=2 | renamerename | 파일 이름 바꾸기 |- | colspan=2 | tmpfiletmpfile | 임시 파일로 포인터 되돌리기 |- | colspan=2 | tmpnamtmpnam | 특수 파일 이름 되돌려주기 |}
## 상수
stdio.h 헤더에 파일 입출력과 관련해 다음과 같은 상수들이 정의되어 있다. {| class="wikitable" |- ! 이름 !! 설명 |- ! | EOF | 파일의 끝의 상태를 나타내는 int 타입의 음수의 정수 |- ! | BUFSIZ | setbuf() 함수에 의해 사용되는 버퍼의 크기를 나타내는 정수 |- ! | FILENAME_MAX | 열릴 수 있는 모든 파일의 이름을 충분히 저장할 수 있을 정도로 큰 char 배열의 크기 |- ! | FOPEN_MAX | 동시에 열려있는 파일들의 개수를 나타내며 최소 8로 표시됨 |- ! | _IOFBF | "input/output fully buffered"의 축약어. 열린 스트림에 블록 버퍼링된 입출력을 요청하는 setvbuf() 함수에 전달되는 정수 |- ! | _IOLBF |"input/output line buffered"의 축약어; 열린 스트림에 라인 버퍼링된 입출력을 요청하는 setvbuf() 함수에 전달되는 정수 |- ! | _IONBF |"input/output not buffered"의 축약어; 열린 스트림에 대해 버퍼링되지 않은 입출력을 요청하기 위한 setvbuf() 함수에 전달되는 정수 |- ! | L_tmpnam | tmpnam() 함수에 의해 생성된 임시 파일 이름을 저장할 수 있을 정도의 크기를 가진 char 배열의 크기 |- ! | NULL | 널 포인터 상수에 확장하는 매크로. 메모리 안의 객체의 유효한 주소가 아니도록 한 포인터 값을 나타낸 상수 |- ! | SEEK_CUR | 현재 파일 위치에 대해 위치 변경을 요청하는 fseek()에 전달되는 정수 |- ! | SEEK_END | 파일의 끝에 대해 위치 조정을 요청하기 위한 fseek() 함수에 전달되는 정수. |- ! | SEEK_SET | 파일의 시작 위치를 기준으로 한 위치 지정을 요청하기 위한 fseek() 함수에 전달되는 정수. |- ! | TMP_MAX | tmpnam() 기능에 의해 만들어지는 특수 파일이름의 최대 길이. (최소 25자) |}
## 변수
stdio.h 헤더에 포함된 변수들로 다음과 같이 정의된 것들이 있다. {| class="wikitable" |- ! 이름 !! 설명 |- ! | stdin | 표준 입력 스트림으로 나타나는 파일에 대한 포인터. 키보드로 주로 쓰임. |- ! | stdout | 표준 출력 스트림으로 나타나는 파일에 대한 포인터. 디스플레이 터미널로 주로 쓰임. |- ! | stderr | 표준 에러 스트림으로 나타나는 파일에 대한 포인터. 디스플레이 터미널로 쓰임. |}
## 멤버 타입
stdio.h 헤더에 정의된 데이터 타입으로 다음과 같은 것들이 있다. *FILE – 파일 핸들이라고도 한다. 다음과 같은 입출력 명령을 수행을 필요로 하는 파일이나 텍스트 스트림에 관한 정보를 담은 오파크 타입이다. ** 파일 식별자와 같은 입출력 장치와 연관련 플랫폼 특수 식별자. **버퍼 **스트림 지향 식별자 (unset, 좁은, 혹은 넓게) **상태 식별자를 버퍼링하는 스트림 (버퍼링되지 않음, 라인 버퍼링, 완전 버퍼림) **I/O 모드 식별자 (입력 스트림, 출력 스트림, 업데이트 스트림) **바이너리/텍스트 모드 식별자 **파일의 끝 식별자 **에러 식별자 **현재 스트림 위치 및 멀티바이트 전환 상태 (fpos_t 타입의 객체) **재귀 잠금 (C11 요구함) *fpos_t – 특별히 식별된 파일의 모든 바이트의 위치와 모든 지원되는 멀티바이트 문자 인코딩에 일어날 수 있는 모든 전환 상태를 담은 비배열 타입. 파일에서 모든 바이트의 위치를 고유하게 식별할 수 있는 비라이언트 유형, 모든 지원되는 멀티 부팅 문자 인코딩에서 발생할 수 있는 모든 변환 상태 *size_t – sizeof 오퍼레이터의 결과를 나타낸 unsigned 정수.
## 확장
POSIX 표준은 메모리를 할당하는 readline 함수와, FILE 객체와 파일 식별자간 링크를 만드는 fileno, fdopen 함수와, 메모리 내 버퍼를 가리키는 FILE 객체를 생성하는 함수 그룹 등 stdio 기능들로 구성된 몇가지 확장 기능을 정의한다.SUS
# 예시
아래 C 프로그램은 'myfile'이라는 바이너리 파일을 열고 파일 안의 다섯 바이트를 읽고 파일을 닫는 과정을 거친다. #include #include int main(void) { char buffer[5] = {0}; /* 초기화 */ int i; FILE *fp = fopen("myfile", "rb"); if (fp == NULL) { perror("파일 열기 실패. \"myfile\""); return EXIT_FAILURE; } for (i = 0; i < 5; i++) { int rc = getc(fp); if (rc == EOF) { fputs("읽는 도중 에러 발생.\n", stderr); return EXIT_FAILURE; } buffer[i] = rc; } fclose(fp); printf("파일에는 다음과 같은 글자들이 있습니다. %x %x %x %x %x\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4]); return EXIT_SUCCESS; }