Namespaces
Variants

FILE

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

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

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

I/O 스트림은 형식화되지 않은 입출력과 형식화된 입출력 모두에 사용할 수 있습니다. 또한 입출력을 처리하는 함수들은 로케일을 인식할 수 있어, 필요한 경우 와이드/멀티바이트 변환이 수행됩니다.

목차

스트림 상태

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

  1. (C95) 문자 너비: 설정되지 않음, 좁은 문자, 또는 넓은 문자.
  2. (C95) 멀티바이트 문자와 와이드 문자 간 변환을 위한 파싱 상태 ( mbstate_t 타입의 객체)
  3. 버퍼링 상태: 버퍼링 없음, 줄 버퍼링, 완전 버퍼링.
  4. 외부 사용자 제공 버퍼로 대체될 수 있는 버퍼.
  5. I/O 모드: 입력, 출력, 또는 갱신(입력 및 출력 모두).
  6. 바이너리/텍스트 모드 표시기.
  7. 파일 끝 상태 표시기.
  8. 오류 상태 표시기.
  9. fpos_t 타입의 객체로 접근 가능한 파일 위치 표시기. 와이드 스트림의 경우 파싱 상태를 포함함.
  10. (C11) 여러 스레드가 스트림을 읽기, 쓰기, 위치 지정 또는 위치 조회할 때 데이터 경쟁을 방지하기 위한 재진입 잠금.

좁은 및 넓은 방향성

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

와이드 방향성을 가진 스트림의 변환 상태는 스트림의 방향성이 설정되는 시점에 설치된 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는 이후 setlocale 호출과 관계없이 방향이 변경될 때까지 이 LC_CTYPE 패싯이 이 스트림에 대한 모든 향후 I/O에 사용될 것을 요구합니다.

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

참고문헌

  • C17 표준 (ISO/IEC 9899:2018):
  • 7.21 입력/출력 <stdio.h> (p: 217-247)
  • 7.29 확장 멀티바이트 및 와이드 문자 유틸리티 <wchar.h> (p: 295-325)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.21 Input/output <stdio.h> (p: 296-339)
  • 7.29 Extended multibyte and wide character utilities <wchar.h> (p: 402-446)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.19 입출력 <stdio.h> (p: 262-305)
  • 7.24 확장 멀티바이트 및 와이드 문자 유틸리티 <wchar.h> (p: 348-392)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.9 입력/출력 <stdio.h>

참고 항목

입력 스트림과 연관된 FILE * 타입의 표현식
출력 스트림과 연관된 FILE * 타입의 표현식
오류 출력 스트림과 연관된 FILE * 타입의 표현식
(매크로 상수)