맨위로가기

C 파일 입출력

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

C 파일 입출력은 C 표준 라이브러리의 헤더 파일을 통해 제공되며, 파일 접근, 직접 입출력, 형식화되지 않은 입출력, 형식화된 입출력, 파일 위치 지정, 오류 처리 등의 기능을 포함한다. 주요 기능은 C 표준 라이브러리에 정의되어 있으며, POSIX 표준에 의해 확장되었다. stdio.h의 대안으로는 C++ iostream과 Sfio가 있다.

더 읽어볼만한 페이지

  • 입출력 - 터치 타이핑
    터치 타이핑은 키보드를 보지 않고 손가락 위치를 기억해 타이핑하는 기술로, 효율적인 방법으로 알려져 있으며 꾸준한 연습으로 속도와 정확성을 향상시킬 수 있다.
  • 입출력 - 입력
    입력은 컴퓨터에 정보나 명령을 전달하는 방식으로, 키보드, 마우스, 스캐너, 음성 입력 장치, 게임 컨트롤러 등 다양한 장치를 통해 이루어지며 '가져오다' 또는 '읽어 들이다'와 같은 의미로도 사용된다.
  • C 표준 라이브러리 - 파일 끝
    파일 끝(EOF)은 데이터 소스에서 더 이상 읽을 데이터가 없음을 나타내는 조건이다.
  • C 표준 라이브러리 - C 자료형
    C 자료형은 C 언어에서 데이터 형태를 정의하는 기본 요소로, 다양한 크기와 속성을 가진 산술, 부울 자료형과 구조체, 공용체 등을 제공하며, 컴파일러 및 시스템 아키텍처에 따라 크기와 동작 방식이 달라질 수 있다.
C 파일 입출력
개요
정의 위치stdio.h 헤더 파일
스트림
표준 스트림stdin
stdout
stderr
파일 스트림파일 포인터를 사용하여 파일에 접근
함수
파일 접근fopen
fclose
문자 입출력fgetc
fgets
fputc
fputs
getc
getchar
putc
putchar
ungetc
직접 입출력fread
fwrite
위치 지정fgetpos
fseek
fsetpos
ftell
rewind
포맷 입출력fprintf
fscanf
printf
scanf
snprintf
sprintf
sscanf
vfprintf
vfscanf
vprintf
vscanf
vsnprintf
vsprintf
vsscanf
에러 처리clearerr
feof
ferror
perror
기타
관련 주제C 파일 입출력
C 문자열 처리
C 언어의 동적 메모리 할당

2. 역사

stdio.h 라이브러리는 스트림을 사용하여 키보드, 프린터, 터미널 등 물리 장치나 시스템에서 지원하는 다른 종류의 파일을 조작한다. 스트림은 이러한 장치를 동일한 방식으로 처리하기 위한 추상화이다. 모든 스트림은 관련 물리 장치의 차이와 관계없이 유사한 속성을 갖는다.[12]

POSIX 표준에서는 stdio에 대한 확장을 정의하고 있다. 이를 통해 메모리를 자동으로 할당하는 `readline` 함수, `FILE` 형식과 파일 디스크립터를 연결하는 `fileno` 함수와 `fdopen` 함수를 사용하는 것이 가능하게 된다.[13]

3. 주요 기능

C 파일 입출력 기능의 대부분은 C 표준 라이브러리 헤더 파일인 `stdio.h`에 정의되어 있다. (C++의 경우 `cstdio` 헤더에 포함되어 있으며, `std` 네임스페이스를 사용해야 한다.)[12]

이 라이브러리는 키보드, 프린터, 터미널과 같은 물리적 장치 또는 시스템에서 지원하는 다른 모든 유형의 파일과 작동하기 위해 스트림이라고 하는 것을 사용한다. 스트림은 이러한 장치와 통일된 방식으로 상호 작용하기 위한 추상화이다. 모든 스트림은 연결된 물리적 매체의 개별 특성과 관계없이 유사한 속성을 갖는다.[12]

C 언어의 표준 입출력 함수 목록
기능바이트 문자와이드 문자설명
파일 접근fopen파일을 연다 (윈도우에서는 비-유니코드 파일 이름, 유닉스에서는 UTF-8 파일 이름).
freopen기존 스트림으로 다른 파일을 연다.
fflush출력 스트림을 실제 파일과 동기화한다.
fclose파일을 닫는다.
setbuf파일 스트림에 버퍼를 장착시킨다.
setvbuf파일 스트림 크기에 맞게 버퍼를 장착시킨다.
fwide전각 문자와 반각 문자간 파일 스트림 교환.
직접 입출력fread파일에서 데이터를 읽는다.
fwrite파일에 데이터를 쓴다.
비형식화 입출력fgetc, getcfgetwc, getwc파일 스트림으로부터 바이트 또는 와이드 문자를 읽는다.
fgetsfgetws파일 스트림으로부터 바이트 또는 와이드 문자열을 한 줄 읽는다.
fputc, putcfputwc, putwc파일 스트림에 바이트 또는 와이드 문자를 쓴다.
fputsfputws파일 스트림에 바이트 또는 와이드 문자열을 쓴다.
getchargetwchar표준 입력으로부터 바이트 또는 와이드 문자를 읽는다.
gets새 줄이 나오거나 파일 끝까지 갈 때까지 표준 입력으로부터 바이트 문자열을 읽는다. (C99에서 사용 중단, C11에서 삭제)
putcharputwchar표준 출력으로 바이트 또는 와이드 문자를 쓴다.
puts표준 출력으로 바이트 문자열을 쓴다.
ungetcungetwc파일 스트림에 바이트 또는 와이드 문자를 제자리에 돌려놓는다.
형식화 입출력scanf, fscanf, sscanfwscanf, fwscanf, swscanf파일 스트림이나 버퍼의 표준 입력으로부터 형식화된 바이트 또는 와이드 문자를 읽는다.
vscanf, vfscanf, vsscanfvwscanf, vfwscanf, vswscanf가변 인자 목록을 쓰는 파일 스트림이나 버퍼의 표준 입력으로부터 형식화된 바이트 또는 와이드 문자를 읽는다.
printf, fprintf, sprintf, snprintfwprintf, fwprintf, swprintf파일 스트림이나 버퍼의 표준 출력으로 형식화된 바이트 또는 와이드 문자를 출력한다.
vprintf, vfprintf, vsprintf, vsnprintfvwprintf, vfwprintf, vswprintf가변 인자 목록을 쓰는 파일 스트림이나 버퍼의 표준 출력으로 형식화된 바이트 또는 와이드 문자를 출력한다.
perror표준 에러에 현재 에러 설명을 쓴다.
파일 위치 조정ftell, ftello현재 파일 포인터를 되돌려준다.
fseek, fseeko파일의 특정 위치로 파일 포인터를 이동한다.
fgetpos파일 포인터를 얻는다.
fsetpos파일의 특정 위치로 파일 포인터를 이동한다.
rewind파일 포인터를 파일의 첫 시작 부분으로 이동한다.
에러 조작clearerr에러를 지운다.
feof파일의 끝을 체크한다.
ferror파일 에러를 체크한다.
파일 조작 명령remove파일을 삭제한다.
rename파일 이름을 수정한다.
tmpfile임시 파일로 포인터를 되돌려준다.
tmpnam특수 파일 이름을 되돌려준다.


3. 1. 파일 접근

C 언어에서 파일 입출력의 기본은 파일을 열고 닫는 것이다. 파일을 열 때는 `fopen()` 함수를 사용하고, 파일을 닫을 때는 `fclose()` 함수를 사용한다. `freopen()` 함수는 이미 열려 있는 스트림을 다른 파일에 연결할 때 사용된다.

`fflush()` 함수는 출력 스트림의 버퍼를 비워 그 내용을 실제 파일에 기록한다. `setbuf()` 함수와 `setvbuf()` 함수는 파일 스트림의 버퍼링 방식을 설정하는 데 사용된다.

`fwide()` 함수는 스트림의 입출력 단위를 바이트(반각 문자) 또는 와이드 문자(전각 문자)로 설정한다. 이 함수는 한국어와 같이 멀티바이트 문자를 처리하는 데 중요하다.[12]

파일 접근 관련 함수
함수설명
fopen파일을 연다. (윈도우에서는 비-유니코드 파일 이름, 유닉스에서는 UTF-8 파일 이름)
freopen이미 열려있는 스트림으로 다른 파일을 연다.
fflush출력 스트림을 실제 파일과 동기화한다.
fclose파일을 닫는다.
setbuf파일 스트림에 버퍼를 설정한다.
setvbuf파일 스트림 크기에 맞게 버퍼를 설정한다.
fwide파일 스트림을 와이드 문자 입출력과 좁은 문자 입출력 간에 전환한다.


3. 2. 직접 입출력

https://en.cppreference.com/w/c/io/fread fread 함수와 https://en.cppreference.com/w/c/io/fwrite fwrite 함수는 형식 지정 없이 파일에서 데이터를 읽고 쓴다.[12]

함수설명
https://en.cppreference.com/w/c/io/fread fread파일에서 데이터를 읽는다.
https://en.cppreference.com/w/c/io/fwrite fwrite파일에 데이터를 쓴다.


3. 3. 형식화되지 않은 입출력

입출력fgetc, getcfgetwc, getwc파일 스트림에서 바이트 또는 와이드 문자를 읽는다.fgetsfgetws파일 스트림에서 한 줄의 문자열을 읽는다.fputc, putcfputwc, putwc파일 스트림에 바이트 또는 와이드 문자를 쓴다.fputsfputws파일 스트림에 문자열을 쓴다.표준 입출력getchargetwchar표준 입력(stdin)에서 바이트 또는 와이드 문자를 읽는다.gets표준 입력에서 문자열을 읽는다. (보안 문제로 사용하지 않음)[12]putcharputwchar표준 출력(stdout)에 바이트 또는 와이드 문자를 쓴다.puts표준 출력에 문자열을 쓴다.기타ungetcungetwc읽은 문자를 다시 스트림에 되돌려 놓는다.


3. 4. 형식화된 입출력

C 언어에서 형식화된 입출력은 데이터를 특정 형식에 맞춰 입출력하는 방식을 의미한다. 이는 C 표준 라이브러리의 `` 헤더 파일에 정의된 함수들을 통해 수행된다.

형식화된 입출력 함수
함수 종류바이트 문자 함수와이드 문자 함수설명
형식화된 출력`printf`, `fprintf`, `sprintf`, `snprintf``wprintf`, `fwprintf`, `swprintf`형식 지정자를 사용하여 데이터를 형식화하여 표준 출력, 파일, 문자열 버퍼에 출력한다.
`vprintf`, `vfprintf`, `vsprintf`, `vsnprintf``vwprintf`, `vfwprintf`, `vswprintf`가변 인자를 사용하여 데이터를 형식화하여 표준 출력, 파일, 문자열 버퍼에 출력한다.
형식화된 입력`scanf`, `fscanf`, `sscanf``wscanf`, `fwscanf`, `swscanf`형식 지정자를 사용하여 표준 입력, 파일, 문자열 버퍼에서 형식화된 데이터를 읽어온다.
`vscanf`, `vfscanf`, `vsscanf``vwscanf`, `vfwscanf`, `vswscanf`가변 인자를 사용하여 표준 입력, 파일, 문자열 버퍼에서 형식화된 데이터를 읽어온다.

3. 5. 파일 위치 지정

3. 6. 오류 처리

4. 상수 및 변수

C 언어의 표준 입출력 기능은 스트림을 사용하여 키보드, 프린터, 터미널 등 물리 장치나 시스템에서 지원하는 다른 종류의 파일을 조작한다. 스트림은 이러한 장치를 동일한 조작으로 처리하기 위한 추상화에 이용된다. 모든 스트림은 관련 물리 장치의 차이와 관계없이 유사한 속성을 갖는다.[12]

stdio.h영어 헤더에는 파일 입출력과 관련된 상수와 변수들이 정의되어 있다.

4. 1. 상수

stdio.h영어 헤더에는 파일 입출력과 관련하여 다음과 같은 상수들이 정의되어 있다.

이름설명
EOF파일의 끝 상태를 나타내는 음수 정수이다.
[http://c-p-p.net/c/stdio.h/bufsiz 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자)


4. 2. 변수

stdio.h영어 헤더에는 다음과 같은 변수들이 정의되어 있다.[12]

이름설명
stdin표준 입력 스트림으로 나타나는 파일에 대한 포인터. 주로 키보드를 가리킨다.
stdout표준 출력 스트림으로 나타나는 파일에 대한 포인터. 주로 디스플레이 터미널을 가리킨다.
stderr표준 에러 스트림으로 나타나는 파일에 대한 포인터. 주로 디스플레이 터미널을 가리킨다.


5. 멤버 타입

`stdio.h` 헤더에는 다음과 같은 데이터 타입들이 정의되어 있다.

6. 확장 (POSIX)

POSIX 표준은 `stdio.h`에 대한 몇 가지 확장을 정의한다. 여기에는 메모리를 할당하는 `readline` 함수, `FILE` 객체와 파일 식별자 간의 연결을 만드는 `fileno` 및 `fdopen` 함수, 메모리 내 버퍼를 가리키는 `FILE` 객체를 생성하는 함수 그룹 등이 포함된다.[19]

7. stdio.h의 대안

AT&T 벨 연구소에서 개발한 Sfio[6](Safe/Fast I/O)는 1991년에 도입되었으며, `stdio.h` 설계의 비일관성, 안전하지 않은 관행 및 비효율성을 개선하는 것을 목표로 했다. Sfio의 기능 중 하나는 스트림에 콜백 함수를 삽입하여 스트림에서 읽거나 스트림에 기록된 데이터의 처리를 사용자 지정할 수 있다는 것이다.[7] Sfio는 1997년에 외부에 공개되었으며, 마지막 릴리스는 2005년 2월 1일이었다.[8]

C++ iostream영어 라이브러리는 ISO C++ 표준의 일부이다. ISO C++는 여전히 `stdio.h` 기능을 필요로 한다.

8. 예제

다음은 "myfile"이라는 이진 파일을 열어 파일 안의 다섯 바이트를 읽고 파일을 닫는 C 프로그램 예제이다.

```c

#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;

}

```

이 코드는 `fopen()` 함수를 사용하여 "myfile" 파일을 이진 읽기 모드("rb")로 연다. 파일 열기에 실패하면 `perror()` 함수를 호출하여 오류 메시지를 출력하고 프로그램을 종료한다. 파일 열기에 성공하면 `getc()` 함수를 사용하여 파일에서 5바이트를 읽어 `buffer` 배열에 저장한다. `getc()` 함수가 `EOF`를 반환하면 파일 읽기 중 오류가 발생한 것이므로, `fputs()` 함수를 사용하여 오류 메시지를 출력하고 프로그램을 종료한다. 5바이트를 모두 읽은 후에는 `fclose()` 함수를 사용하여 파일을 닫고, `printf()` 함수를 사용하여 읽은 내용을 16진수로 출력한다.

다음은 "myfile"이라는 바이너리 파일을 열어 5바이트를 읽은 다음 파일을 닫는 다른 C 프로그램 예제이다.

```c

#include

#include

int main(void) {

char buffer[5];

FILE* fp = fopen("myfile", "rb");

if (fp == NULL) {

perror("파일 \"myfile\" 열기에 실패했습니다");

return EXIT_FAILURE;

}

if (fread(buffer, 1, 5, fp) < 5) {

fclose(fp);

fputs("파일을 읽는 동안 오류가 발생했습니다.\n", stderr);

return EXIT_FAILURE;

}

fclose(fp);

printf("읽은 바이트는: ");

for (int i = 0; i < 5; ++i) {

printf("%02X ", buffer[i]);

}

putchar('\n');

return EXIT_SUCCESS;

}

```

위 코드는 `fopen()` 함수로 "myfile"이라는 이름의 파일을 바이너리 읽기 모드("rb")로 연다. `fread()` 함수는 `fp` 파일 포인터에서 가리키는 파일에서 1바이트(`buffer`의 원소 크기)씩 5개(`buffer`의 길이)의 데이터를 읽어 `buffer` 배열에 저장한다. 만약 `fread()` 함수가 5보다 작은 값을 반환하면, 파일의 끝에 도달했거나 읽기 오류가 발생했음을 의미한다. 이때 `fclose(fp)`로 파일을 닫고 `fputs()`로 오류 메시지를 출력한 후 프로그램을 종료한다.

다음은 ''hogefile''이라는 바이너리 파일을 열어 5바이트를 읽고 파일을 닫는 C 프로그램 예제이다.

```c

#include

#include

int main(void) {

char buffer[5];

FILE* fp = fopen("hogefile", "rb");

if (fp == NULL) {

perror("\"hogefile\"을 열 수 없습니다.");

return EXIT_FAILURE;

}

for (int 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;

}

```

위 코드는 `fopen()` 함수를 사용하여 "hogefile" 파일을 이진 읽기 모드("rb")로 연다. 파일 열기에 실패하면 `perror()` 함수를 호출하여 오류 메시지를 출력하고 프로그램을 종료한다. 파일 열기에 성공하면 `getc()` 함수를 사용하여 파일에서 5바이트를 읽어 `buffer` 배열에 저장한다. `getc()` 함수가 `EOF`를 반환하면 파일 읽기 중 오류가 발생한 것이므로, `fputs()` 함수를 사용하여 오류 메시지를 출력하고 프로그램을 종료한다. 5바이트를 모두 읽은 후에는 `fclose()` 함수를 사용하여 파일을 닫고, `printf()` 함수를 사용하여 읽은 내용을 16진수로 출력한다.

위 예제 코드들은 모두 `` 헤더 파일에 정의된 함수들을 사용한다.

참조

[1] 서적 ISO/IEC 9899:1999 specification
[2] 서적 The UNIX Programming Environment Prentice Hall
[3] 간행물 A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 http://www.cs.dartmo[...]
[4] 웹사이트 (stdio.h) - C++ Reference http://www.cplusplus[...] 2021-07-25
[5] 문서 stdio.h SUS
[6] 웹사이트 Sfio: A Safe/Fast I/O Library http://akpublic.rese[...] 2021-03-16
[7] 학술 SFIO: Safe/Fast String/File IO
[8] 학술 Extended Formatting with Sfio
[9] 서적 ISO/IEC 9899:1999 specification http://www.open-std.[...]
[10] 서적 The UNIX Programming Environment Prentice Hall
[11] 간행물 A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 http://www.cs.dartmo[...]
[12] URL http://www.cplusplus[...]
[13] 문서 stdio.h SUS
[14] 학술 SFIO: Safe/Fast String/File IO
[15] 학술 Extended Formatting with Sfio
[16] 서적 ISO/IEC 9899:1999 specification http://www.open-std.[...]
[17] 서적 The UNIX Programming Environment Prentice Hall
[18] 간행물 A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 http://www.cs.dartmo[...]
[19] 문서 stdio.h SUS



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com