FILE

From cppreference.com
< c‎ | io
File input/output
Types and objects
Functions
File access
Unformatted input/output
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Formatted input
(C99) (C99) (C99) (C11) (C11) (C11)
(C99) (C99) (C99) (C11) (C11) (C11)
Direct input/output
Formatted output
File positioning
Error handling
Operations on files
Defined in header <stdio.h>
typedef /* unspecified */ FILE;

Each FILE object denotes a C stream.

C standard does not specify whether FILE is a complete object type. While it may be possible to copy a valid FILE, using a pointer to such a copy as an argument for an I/O function invokes unspecified behavior. In other words, FILE

I/O streams can be used for both unformatted and formatted input and output. Furthermore, the functions that handle input and output can also be locale-sensitive, such that wide/multibyte conversions are performed as necessary.

Stream state

Besides the system-specific information necessary to access the device (e.g., a POSIX file descriptor), each FILE object directly or indirectly holds the following:

  1. (C95) Character width: unset, narrow, or wide.
  2. (C95) Parse state for conversions between multibyte and wide characters (an object of type mbstate_t
  3. Buffering state: unbuffered, line-buffered, fully buffered.
  4. The buffer, which may be replaced by an external, user-provided buffer.
  5. I/O mode: input, output, or update (both input and output).
  6. Binary/text mode indicator.
  7. End-of-file status indicator.
  8. Error status indicator.
  9. File position indicator, accessible as an object of type fpos_t, which, for wide streams, includes parse state.
  10. (C11) Reentrant lock used to prevent data races when multiple threads read, write, position, or query the position of a stream.

Narrow and wide orientation

A newly opened stream has no orientation. The first call to fwide or to any I/O function establishes the orientation: a wide I/O function makes the stream wide-oriented; a narrow I/O function makes the stream narrow-oriented. Once set, the orientation can be changed with only freopen . Narrow I/O functions cannot be called on a wide-oriented stream; wide I/O functions cannot be called on a narrow-oriented stream. Wide I/O functions convert between wide and multibyte characters as if by calling mbrtowc or wcrtomb

The conversion state of a stream with wide orientation is established by the C locale that is installed at the time the stream's orientation is set.

Binary and text modes

A text stream is an ordered sequence of characters that can be composed into lines; a line can be decomposed into zero or more characters plus a terminating '\n' (“newline”) character. Whether the last line requires a terminating '\n' is implementation-defined. Furthermore, characters may have to be added, altered, or deleted on input and output to conform to the conventions for representing text in the OS (in particular, C streams on Windows OS convert '\n' to '\r\n' on output, and convert '\r\n' to '\n'

Data read in from a text stream is guaranteed to compare equal to the data that were earlier written out to that stream only if each of the following is true:

  • The data consist of only printing characters and/or the control characters '\t' and '\n' (in particular, on Windows OS, the character '\0x1A'
  • No '\n'
  • The last character is '\n'.

A binary stream

Notes

POSIX explicitly requires that the LC_CTYPE facet of the currently installed C locale be stored within the FILE object the moment the stream's orientation becomes wide; POSIX requires that this LC_CTYPE facet be used for all future I/O on this stream until the orientation is changed, regardless of any subsequent call to setlocale

It is intended that each line of text be composed of data that are essentially human-readable. POSIX implementations do not distinguish between text and binary streams (there is no special mapping for '\n'

References

  • C17 standard (ISO/IEC 9899:2018):
  • 7.21 Input/output <stdio.h> (p: 217-247)
  • 7.29 Extended multibyte and wide character utilities <wchar.h> (p: 295-325)
  • C11 standard (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 standard (ISO/IEC 9899:1999):
  • 7.19 Input/output <stdio.h> (p: 262-305)
  • 7.24 Extended multibyte and wide character utilities <wchar.h> (p: 348-392)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.9 INPUT/OUTPUT <stdio.h>

See also

expression of type FILE* associated with the input stream
expression of type FILE* associated with the output stream
expression of type FILE* associated with the error output stream
(macro constant)