{{위키데이터 속성 추적}}
{{C 표준 라이브러리}}
프로그래밍 언어 [[C (프로그래밍 언어)|C]]는 [[컴퓨터 파일|파일]] [[입출력]]을 위한 많은 [[표준 라이브러리]] [[서브루틴|기능]]들을 제공한다. 이 기능들은 대부분 [[C 표준 라이브러리]] [[헤더 파일]] {{mono|<stdio.h>}}로부터 구성된다.<ref>{{서적 인용|url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf |title=ISO/IEC 9899:1999 specification |at=p. 274, § 7.19}}</ref> 이 기능들은 1970년대 초반 벨 연구소의 [[마이크 레스크]]가 작성한 "휴대용 입출력 패키지"에서 왔으며,<ref>{{서적 인용|last1=Kernighan |first1=Brian |authorlink1=Brian Kernighan |last2=Pike |first2=Rob |authorlink2=Rob Pike |title=[[The UNIX Programming Environment]] |publisher=[[Prentice Hall]] |location=[[Englewood Cliffs]] |year=1984 |page=[https://archive.org/details/unixprogramminge0000kern/page/200 200]}}</ref> [[유닉스]] [[버전 7 유닉스|버전 7]]에서 정식으로 운영체제의 한 부분이 되었다.<ref name="reader">{{기술보고서 인용|first1=M. D. |last1=McIlroy |authorlink1=Doug McIlroy |year=1987 |url=http://www.cs.dartmouth.edu/~doug/reader.pdf |title=A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 |series=CSTR |number=139 |institution=Bell Labs}}</ref>

C의 입출력 기능은 현대의 표준의 기준으로 하면 상당이 낮은 수준이다. C는 입력 스트림이나 출력 스트림과 같은 파일에 대한 모든 작업들을 [[바이트]] 단위의 흐름으로 추상화한다. 과거의 다른 프로그래밍 언어와는 달리 C는 데이터 파일에 [[임의 액세스]]를 하는 기능을 제공하지 않고 대신, 파일 매체 저장소를 읽기 위해 프로그래머가 스트림을 생성해줘야 한다. 파일 매체를 찾고, 스트림에서 바이트 단위로 연속으로 읽는다.

파일 입출력의 스트림 모델은 C 프로그래밍 언어가 개발되었을 때 같이 개발되던 유닉스를 통해 대중화되었다. 수많은 현대 운영체제는 유닉스로부터 스트림을 물려받았으며, [[:분류:C 프로그래밍 언어군|C 프로그래밍 언어군]]의 많은 언어들도 C의 파일 입출력 인터페이스를 약간의 수정을 거쳐 물려받았다. (예시 - [[PHP]]).

== 개요 ==
=== 기능 ===
C 파일 입출력 기능의 대부분은 [[C 표준 라이브러리]] [[헤더 파일]]<stdio.h> 에 정의되어 있다. (C++의 경우 표준 C 기능을 포함한 헤더 cstdio에 있으며 std 이름공간을 포함해야 함.)

{| class="wikitable"
|-
!
! 바이트 문자
! 확장 문자
! 설명
|-
! rowspan=7 | 파일 접근
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|fopen}}[http://en.cppreference.com/w/c/io/fopen fopen]
| 파일 열기(윈도우에선 비-유니코드 파일 이름, 유닉에서는 UTF-8 파일 이름)
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|freopen}}[http://en.cppreference.com/w/c/io/freopen freopen]
| 존재하는 스트림으로 다른 파일 열기
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|fflush}}[http://en.cppreference.com/w/c/io/fflush fflush]
| 대응되는 파일로 출력 스트림 동기화하기
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|fclose}}[http://en.cppreference.com/w/c/io/fclose fclose]
| 파일 닫기
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|setbuf}}[http://en.cppreference.com/w/c/io/setbuf setbuf]
| 파일 스트림에 버퍼 장착시키기
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|setvbuf}}[http://en.cppreference.com/w/c/io/setvbuf setvbuf]
| 파일 스트림 크기에 맞게 버퍼 장착
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|fwide}}[http://en.cppreference.com/w/c/io/fwide fwide]
| 전각 문자와 반각 문자간 파일 스트림 교환
|-
! rowspan=2 | 직접 입출력
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|fread}}[http://en.cppreference.com/w/c/io/fread fread]
| 파일 읽기
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|fwrite}}[http://en.cppreference.com/w/c/io/fwrite fwrite]
| 파일 쓰기
|-
! rowspan=9 | 언포맷 입출력
| style="font-family:monospace" | {{앵커|fgetc|getc}}[http://en.cppreference.com/w/c/io/fgetc fgetc]<br />[http://en.cppreference.com/w/c/io/getc getc]
| style="font-family:monospace"| {{앵커|fgetwc|getwc}}[http://en.cppreference.com/w/c/io/fgetwc fgetwc]<br />[http://en.cppreference.com/w/c/io/getwc getwc]
| 파일 스트림으로부터 바이트/{{mono|wchar_t}} 읽기
|-
| style="font-family:monospace" | {{앵커|fgets}}[http://en.cppreference.com/w/c/io/fgets fgets]
| style="font-family:monospace" | {{앵커|fgetws}}[http://en.cppreference.com/w/c/io/fgetws fgetws]
| 파일 스트림으로부터 바이트/{{mono|wchar_t}} 라인 읽기
|-
| style="font-family:monospace" | {{앵커|fputc|putc}}[http://en.cppreference.com/w/c/io/fputc fputc]<br />[http://en.cppreference.com/w/c/io/putc putc]
| style="font-family:monospace" | {{앵커|fputwc|putwc}}[http://en.cppreference.com/w/c/io/fputwc fputwc]<br />[http://en.cppreference.com/w/c/io/putwc putwc]
| 파일 스트림에 바이트/{{mono|wchar_t}} 쓰기
|-
| style="font-family:monospace" | {{앵커|fputs}}[http://en.cppreference.com/w/c/io/fputs fputs]
| style="font-family:monospace" | {{앵커|fputws}}[http://en.cppreference.com/w/c/io/fputws fputws]
| 파일 스트림에 바이트/{{mono|wchar_t}} 문자열 입력
|-
| style="font-family:monospace" | {{앵커|getchar}}[http://en.cppreference.com/w/c/io/getchar getchar]
| style="font-family:monospace" | {{앵커|getwchar}}[http://en.cppreference.com/w/c/io/getwchar getwchar]
| 표준 입력으로부터 바이트/{{mono|wchar_t}} 입력
|-
| style="font-family:monospace" | {{앵커|gets}}
[http://en.cppreference.com/w/c/io/gets gets]

| {{n/a}}
| 새 줄이 나오거나 파일 끝까지 갈때까지 표준 입력으로부터 바이트 문자열 읽기 (deprecated in C99, C11에서 삭제)
|-
| style="font-family:monospace" | {{앵커|putchar}}[http://en.cppreference.com/w/c/io/putchar putchar]
| style="font-family:monospace" | {{앵커|putwchar}}[http://en.cppreference.com/w/c/io/putwchar putwchar]
| 표준 출력으로 바이트/{{mono|wchar_t}} 입력
|-
| style="font-family:monospace" | {{앵커|puts}}[http://en.cppreference.com/w/c/io/puts puts]
| {{n/a}}
| 표준 출력으로 바이트 문자열 입력
|-
| style="font-family:monospace" | {{앵커|ungetc}}[http://en.cppreference.com/w/c/io/ungetc ungetc]
| style="font-family:monospace" | {{앵커|ungetwc}}[http://en.cppreference.com/w/c/io/ungetwc ungetwc]
| 파일 스트림에 바이트/{{mono|wchar_t}} 제자리에 돌려놓기
|-
! rowspan=5 | 포맷 입출력
| style="font-family:monospace" | {{앵커|scanf|fscanf|sscanf}}[http://en.cppreference.com/w/c/io/scanf scanf]<br />[http://en.cppreference.com/w/c/io/fscanf fscanf]<br />[http://en.cppreference.com/w/c/io/sscanf sscanf]
| style="font-family:monospace" | {{앵커|wscanf|fwscanf|swscanf}}[http://en.cppreference.com/w/c/io/wscanf wscanf]<br />[http://en.cppreference.com/w/c/io/fwscanf fwscanf]<br />[http://en.cppreference.com/w/c/io/swscanf swscanf]
| 파일 스트림이나 버퍼의 표준 입력으로부터 형식화된 바이트/{{mono|wchar_t}} 입력 읽기
|-
| style="font-family:monospace" | {{앵커|vscanf|vfscanf|vsscanf}}[http://en.cppreference.com/w/c/io/vscanf vscanf]<br />[http://en.cppreference.com/w/c/io/vfscanf vfscanf]<br />[http://en.cppreference.com/w/c/io/vsscanf vsscanf]
| style="font-family:monospace" | {{앵커|vwscanf|vfwscanf|svwscanf}}[http://en.cppreference.com/w/c/io/vwscanf vwscanf]<br />[http://en.cppreference.com/w/c/io/vfwscanf vfwscanf]<br />[http://en.cppreference.com/w/c/io/vswscanf vswscanf]
| 가변 인자 목록을 쓰는 파일 스트림이나 버퍼의 표준 입력으로부터 형식화된 입력 바이트/{{mono|wchar_t}} 읽기
|-
| style="font-family:monospace" | {{앵커|printf|fprintf|sprintf|snprintf}}[http://en.cppreference.com/w/c/io/printf printf]<br />[http://en.cppreference.com/w/c/io/fprintf fprintf]<br />[http://en.cppreference.com/w/c/io/sprintf sprintf]<br />[http://en.cppreference.com/w/c/io/snprintf snprintf]
| style="font-family:monospace" | {{앵커|wprintf|fwprintf|swprintf}}[http://en.cppreference.com/w/c/io/wprintf wprintf]<br />[http://en.cppreference.com/w/c/io/fwprintf fwprintf]<br />[http://en.cppreference.com/w/c/io/swprintf swprintf]
| 파일 스트림이나 버퍼의 표준 출력으로 형식화된 바이트/{{mono|wchar_t}} 출력을 출력하기
|-
| style="font-family:monospace" | {{앵커|vprintf|vfprintf|vspritf|vsnprintf}}[http://en.cppreference.com/w/c/io/vprintf vprintf]<br />[http://en.cppreference.com/w/c/io/vfprintf vfprintf]<br />[http://en.cppreference.com/w/c/io/vsprintf vsprintf]<br />[http://en.cppreference.com/w/c/io/vsnprintf vsnprintf]
| style="font-family:monospace" | {{앵커|vwprintf|vfwprintf|vswprintf}}[http://en.cppreference.com/w/c/io/vwprintf vwprintf]<br />[http://en.cppreference.com/w/c/io/vfwprintf vfwprintf]<br />[http://en.cppreference.com/w/c/io/vswprintf vswprintf]{{깨진 링크|url=http://en.cppreference.com/w/c/io/vswprintf }}
| 가변 인자 목록을 쓰는 파일 스트림이나 버퍼의 표준 출력으로 형식화된 바이트/{{mono|wchar_t}} 출력을 출력
|-
| style="font-family:monospace" | {{앵커|perror}}[http://en.cppreference.com/w/c/io/perror perror]
| {{n/a}}
| 표준 에러에 [[errno.h|현재 에러]] 설명 쓰기
|-
! rowspan=5 | 파일 위치 조정
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|ftell}}[http://en.cppreference.com/w/c/io/ftell ftell]<br/>ftello
| 현재 파일 포인터 되돌려주기
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|fseek}}[http://en.cppreference.com/w/c/io/fseek fseek]<br/>fseeko
| 파일의 특정 위치로 파일 포인터 이동
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|fgetpos}}[http://en.cppreference.com/w/c/io/fgetpos fgetpos]
| 파일 포인터 얻기
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|fsetpos}}[http://en.cppreference.com/w/c/io/fsetpos fsetpos]
| 파일의 특정 위치로 파일 포인터 이동
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|rewind}}[http://en.cppreference.com/w/c/io/rewind rewind]
| 파일 포인터를 파일의 첫 시작 부분으로 이동
|-
! rowspan=3 | 에러 조작
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|clearerr}}[http://en.cppreference.com/w/c/io/clearerr clearerr]
| 에러 삭제
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|feof}}[http://en.cppreference.com/w/c/io/feof feof]
| 파일의 끝 체크
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|ferror}}[http://en.cppreference.com/w/c/io/ferror ferror]
| 파일 에러 체크
|-
! rowspan=4 | 파일 조작 명령
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|remove}}[http://en.cppreference.com/w/c/io/remove remove]
| 파일 삭제
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|rename}}[http://en.cppreference.com/w/c/io/rename rename]
| 파일 이름 [[수정 (컴퓨터)|수정]]
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|tmpfile}}[http://en.cppreference.com/w/c/io/tmpfile tmpfile]
| 임시 파일로 포인터 되돌리기
|-
| colspan=2 style="text-align:center;font-family:monospace" | {{앵커|tmpnam}}[http://en.cppreference.com/w/c/io/tmpnam tmpnam]
| 특수 파일 이름 되돌려주기
|}

=== 상수 ===
{{mono|stdio.h}} 헤더에 파일 입출력과 관련해 다음과 같은 상수들이 정의되어 있다.

{| class="wikitable"
|-
! 이름 !! 설명
|-
! style="font-family:monospace" | [[End-of-file|EOF]]
| 파일의 끝의 상태를 나타내는 {{mono|int}} 타입의 음수의 정수
|-
! style="font-family:monospace" | [http://c-p-p.net/c/stdio.h/bufsiz BUFSIZ]
| {{mono|setbuf()}} 함수에 의해 사용되는 버퍼의 크기를 나타내는 정수
|-
! style="font-family:monospace" | FILENAME_MAX
| 열릴 수 있는 모든 파일의 이름을 충분히 저장할 수 있을 정도로 큰 {{mono|char}} 배열의 크기
|-
! style="font-family:monospace" | FOPEN_MAX
| 동시에 열려있는 파일들의 개수를 나타내며 최소 8로 표시됨
|-
! style="font-family:monospace" | _IOFBF
| "input/output fully buffered"의 축약어. 열린 스트림에 블록 버퍼링된 입출력을 요청하는 {{mono|setvbuf()}} 함수에 전달되는 정수
|-
! style="font-family:monospace" | _IOLBF
|"input/output line buffered"의 축약어; 열린 스트림에 라인 버퍼링된 입출력을 요청하는 {{mono|setvbuf()}} 함수에 전달되는 정수
|-
! style="font-family:monospace" | _IONBF
|"input/output not buffered"의 축약어; 열린 스트림에 대해 버퍼링되지 않은 입출력을 요청하기 위한 {{mono|setvbuf()}} 함수에 전달되는 정수
|-
! style="font-family:monospace" | L_tmpnam
| {{mono|tmpnam()}} 함수에 의해 생성된 임시 파일 이름을 저장할 수 있을 정도의 크기를 가진 {{mono|char}} 배열의 크기
|-
! style="font-family:monospace" | NULL
| [[널 포인터]] 상수에 확장하는 매크로. 메모리 안의 객체의 유효한 주소가 아니도록 한 포인터 값을 나타낸 상수
|-
! style="font-family:monospace" | SEEK_CUR
| 현재 파일 위치에 대해 위치 변경을 요청하는 {{mono|fseek()}}에 전달되는 정수
|-
! style="font-family:monospace" | SEEK_END
| 파일의 끝에 대해 위치 조정을 요청하기 위한 {{mono|fseek()}} 함수에 전달되는 정수.
|-
! style="font-family:monospace" | SEEK_SET
| 파일의 시작 위치를 기준으로 한 위치 지정을 요청하기 위한 {{mono|fseek()}} 함수에 전달되는 정수.
|-
! style="font-family:monospace" | TMP_MAX
| {{mono|tmpnam()}} 기능에 의해 만들어지는 특수 파일이름의 최대 길이. (최소 25자)
|}

=== 변수 ===
{{mono|stdio.h}} 헤더에 포함된 변수들로 다음과 같이 정의된 것들이 있다.

{| class="wikitable"
|-
! 이름 !! 설명
|-
! style="font-family:monospace" | [[표준 스트림#표준 입력 (stdin)|stdin]]
| 표준 입력 스트림으로 나타나는 파일에 대한 포인터. 키보드로 주로 쓰임.
|-
! style="font-family:monospace" | [[표준 스트림#표준 출력 (stdout)|stdout]]
| 표준 출력 스트림으로 나타나는 파일에 대한 포인터. 디스플레이 터미널로 주로 쓰임.
|-
! style="font-family:monospace" | [[표준 스트림#표준 에러 (stderr)|stderr]]
| 표준 에러 스트림으로 나타나는 파일에 대한 포인터. 디스플레이 터미널로 쓰임.
|}

=== 멤버 타입 ===
{{mono|stdio.h}} 헤더에 정의된 데이터 타입으로 다음과 같은 것들이 있다.

*{{mono|[http://en.cppreference.com/w/c/io FILE]}} – 파일 [[핸들 (컴퓨팅)|핸들]]이라고도 한다. 다음과 같은 입출력 명령을 수행을 필요로 하는 파일이나 텍스트 스트림에 관한 정보를 담은 [[오파크 포인터|오파크 타입]]이다.
** [[파일 식별자]]와 같은 입출력 장치와 연관련 플랫폼 특수 식별자.
**버퍼
**스트림 지향 식별자 (unset, 좁은, 혹은 넓게)
**상태 식별자를 버퍼링하는 스트림 (버퍼링되지 않음, 라인 버퍼링, 완전 버퍼림)
**I/O 모드 식별자 (입력 스트림, 출력 스트림, 업데이트 스트림)
**바이너리/텍스트 모드 식별자
**파일의 끝 식별자
**에러 식별자
**현재 스트림 위치 및 멀티바이트 전환 상태 (fpos_t 타입의 객체)
**재귀 잠금 ([[C11 (C 표준 개정)|C11]] 요구함)
*{{mono|fpos_t}} – 특별히 식별된 파일의 모든 바이트의 위치와 모든 지원되는 멀티바이트 문자 인코딩에 일어날 수 있는 모든 전환 상태를 담은 비배열 타입.
파일에서 모든 바이트의 위치를 고유하게 식별할 수 있는 비라이언트 유형, 모든 지원되는 멀티 부팅 문자 인코딩에서 발생할 수 있는 모든 변환 상태
*{{mono|size_t}} – {{mono|[[sizeof]]}} 오퍼레이터의 결과를 나타낸 [[signed와 unsigned|unsigned 정수]].

=== 확장 ===
[[POSIX]] 표준은 메모리를 할당하는 {{mono|readline}} 함수와, {{mono|FILE}} 객체와 [[파일 식별자]]간 링크를 만드는 {{mono|fileno}}, {{mono|fdopen}} 함수와, 메모리 내 버퍼를 가리키는 {{mono|FILE}} 객체를 생성하는 함수 그룹 등 {{mono|stdio}} 기능들로
구성된 몇가지 확장 기능을 정의한다.<ref>{{man|bd|stdio.h|SUS}}</ref>

== 예시 ==
아래 C 프로그램은 'myfile'이라는 바이너리 파일을 열고 파일 안의 다섯 바이트를 읽고 파일을 닫는 과정을 거친다.

<syntaxhighlight lang="c">
#include <stdio.h>
#include <stdlib.h>

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;
}
</syntaxhighlight>

== 같이 보기 ==
* [[Scanf format string]]
== 각주 ==
{{각주}}

{{C 프로그래밍 언어}}

[[분류:C 표준 라이브러리]]
[[분류:입출력]]