Namespaces
Variants

std:: FILE

From cppreference.net
< cpp ‎ | io ‎ | c
헤더 파일에 정의됨 <cstdio>
typedef /* unspecified */ FILE ;

std::FILE 객체는 C 스트림을 나타냅니다.

C 표준(C++ 표준에서 참조)은 std::FILE 이 완전한 객체 타입인지 여부를 명시하지 않습니다. 유효한 std::FILE 을 복사하는 것이 가능할 수 있지만, 그러한 복사본에 대한 포인터를 I/O 함수의 인수로 사용하는 것은 명시되지 않은 동작을 유발합니다. 다시 말해, std::FILE 은 의미론적으로 복사 불가능할 수 있습니다.

I/O 스트림은 형식화되지 않은(formatted) 및 형식화된(unformatted) 입력과 출력 모두에 사용할 수 있습니다. 또한 입력과 출력을 처리하는 함수들은 로케일-민감적(locale-sensitive)일 수도 있어, 필요에 따라 와이드/멀티바이트 변환이 수행됩니다.

목차

스트림 상태

장치에 접근하는 데 필요한 시스템별 정보( 예를 들어, POSIX 파일 디스크립터) 외에도, 각 std::FILE 객체는 직접 또는 간접적으로 다음을 보유합니다:

  1. 문자 너비: unset, narrow, 또는 wide.
  2. 멀티바이트 문자와 와이드 문자 간 변환을 위한 파싱 상태 ( std::mbstate_t 타입의 객체)
  3. 버퍼링 상태: unbuffered, line-buffered, fully buffered.
  4. 외부 사용자 제공 버퍼로 대체될 수 있는 버퍼.
  5. I/O 모드: input, output, 또는 update (입력과 출력 모두).
  6. 바이너리/텍스트 모드 표시자.
  7. 파일 끝 상태 표시자.
  8. 오류 상태 표시자.
  9. 파일 위치 표시자, std::fpos_t 타입의 객체로 접근 가능하며, 와이드 스트림의 경우 파싱 상태를 포함함.
  10. (C++17) 여러 스레드가 스트림을 읽기, 쓰기, 위치 지정 또는 위치 조회할 때 데이터 경쟁을 방지하는 데 사용되는 재진입 잠금.

좁은 및 넓은 방향성

새로 열린 스트림은 방향성이 없습니다. 첫 번째 std::fwide 호출이나 I/O 함수 호출이 방향성을 설정합니다: 와이드 I/O 함수는 스트림을 와이드 방향으로 만들고, 네로우 I/O 함수는 스트림을 네로우 방향으로 만듭니다. 한번 설정된 방향성은 std::freopen 으로만 변경할 수 있습니다. 와이드 방향 스트림에서는 네로우 I/O 함수를 호출할 수 없으며, 네로우 방향 스트림에서는 와이드 I/O 함수를 호출할 수 없습니다. 와이드 I/O 함수는 스트림에 기술된 변환 상태를 사용하여 std::mbrtowc 이나 std::wcrtomb 을 호출하는 것처럼 와이드 문자와 멀티바이트 문자 간 변환을 수행합니다. 프로그램 내에서 유효한 멀티바이트 문자열과 달리, 파일 내 멀티바이트 문자 시퀀스는 내장된 널 문자를 포함할 수 있으며 초기 시프트 상태에서 시작하거나 끝나지 않아도 됩니다.

와이드 방향성을 가진 스트림의 변환 상태는 스트림의 방향성이 설정되는 시점에 설치된 C 로캘에 의해 결정됩니다.

바이너리 및 텍스트 모드

텍스트 스트림 은 줄로 구성될 수 있는 순서화된 문자 시퀀스입니다; 한 줄은 0개 이상의 문자와 종결 ' \n ' ("newline") 문자로 분해될 수 있습니다. 마지막 줄에 종결 ' \n ' 이 필요한지는 구현에 따라 정의됩니다. 또한, OS에서 텍스트를 표현하기 위한 규칙에 맞추기 위해 입력 및 출력 시 문자가 추가, 변경 또는 삭제될 수 있습니다 (특히, Windows OS의 C 스트림은 출력 시 ' \n ' ' \r \n ' 로 변환하고, 입력 시 ' \r \n ' ' \n ' 로 변환합니다).

텍스트 스트림에서 읽어 들인 데이터가 이전에 해당 스트림에 기록된 데이터와 비교하여 동일함이 보장되려면 다음 각 조건이 참이어야 합니다:

  • 데이터는 출력 가능 문자 및/또는 제어 문자 ' \t ' ' \n ' 로만 구성됩니다 (특히 Windows OS에서는 ' \0 x1A' 문자가 입력을 종료합니다).
  • ' \n ' 문자 바로 앞에는 공백 문자가 없습니다 (이러한 공백 문자는 나중에 해당 출력을 입력으로 읽을 때 사라질 수 있습니다).
  • 마지막 문자는 ' \n ' 입니다.

이진 스트림 은 내부 데이터를 투명하게 기록할 수 있는 순서가 있는 문자 시퀀스입니다. 이진 스트림에서 읽어 들인 데이터는 항상 해당 스트림에 이전에 기록된 데이터와 동일하지만, 구현체가 스트림 끝에 불확정 개수의 널 문자를 추가하는 것이 허용됩니다. 와이드 이진 스트림은 초기 시프트 상태로 끝날 필요가 없습니다.

참고 사항

POSIX는 명시적으로 현재 설치된 C 로캘의 LC_CTYPE 패싯이 스트림의 방향이 와이드가 되는 순간 FILE 객체 내에 저장될 것을 요구합니다; POSIX는 이후 std::setlocale 호출과 관계없이 방향이 변경될 때까지 이 LC_CTYPE 패싯이 이 스트림에 대한 모든 향후 I/O에 사용되어야 함을 요구합니다.

텍스트의 각 줄은 기본적으로 사람이 읽을 수 있는 데이터로 구성되도록 의도되었습니다. POSIX 구현에서는 텍스트 스트림과 바이너리 스트림을 구분하지 않습니다( ' \n ' 또는 다른 어떤 문자에 대해서도 특별한 매핑이 존재하지 않습니다).

참고 항목

원시 장치를 추상화함
(클래스 템플릿)
원시 파일 장치를 구현함
(클래스 템플릿)
입력 스트림과 연관된 FILE * 타입의 표현식
출력 스트림과 연관된 FILE * 타입의 표현식
오류 출력 스트림과 연관된 FILE * 타입의 표현식
(매크로 상수)
C 문서 for FILE