Namespaces
Variants

FILE

From cppreference.net
< c ‎ | io
Определено в заголовочном файле <stdio.h>
typedef /* unspecified */ FILE ;

Каждый FILE объект обозначает поток C.

Стандарт C не определяет, является ли FILE полным типом объекта. Хотя копирование допустимого FILE может быть возможным, использование указателя на такую копию в качестве аргумента для функции ввода-вывода вызывает неопределённое поведение. Другими словами, FILE может быть семантически некопируемым.

Потоки ввода-вывода могут использоваться как для неформатированного, так и для форматированного ввода и вывода. Кроме того, функции, обрабатывающие ввод и вывод, также могут быть чувствительными к локали, так что преобразования широких/многобайтовых символов выполняются по мере необходимости.

Содержание

Состояние потока

Помимо специфической для системы информации, необходимой для доступа к устройству ( например, файловый дескриптор POSIX), каждый объект FILE прямо или косвенно содержит следующее:

  1. (C95) Ширина символа: не установлена, узкая или широкая.
  2. (C95) Состояние парсинга для преобразований между многобайтовыми и широкими символами (объект типа mbstate_t )
  3. Состояние буферизации: без буферизации, построчная буферизация, полная буферизация.
  4. Буфер, который может быть заменен внешним, предоставленным пользователем буфером.
  5. Режим ввода-вывода: ввод, вывод или обновление (и ввод, и вывод).
  6. Индикатор двоичного/текстового режима.
  7. Индикатор состояния конца файла.
  8. Индикатор состояния ошибки.
  9. Индикатор позиции в файле, доступный как объект типа fpos_t , который для широких потоков включает состояние парсинга.
  10. (C11) Реентерабельная блокировка, используемая для предотвращения гонки данных при одновременном чтении, записи, позиционировании или запросе позиции потока несколькими потоками выполнения.

Узкая и широкая ориентация

Вновь открытый поток не имеет ориентации. Первый вызов fwide или любой функции ввода-вывода устанавливает ориентацию: функция широкого ввода-вывода делает поток широкоориентированным; функция узкого ввода-вывода делает поток узкоориентированным. После установки ориентация может быть изменена только с помощью freopen . Функции узкого ввода-вывода не могут вызываться для широкоориентированного потока; функции широкого ввода-вывода не могут вызываться для узкоориентированного потока. Функции широкого ввода-вывода преобразуют между широкими и многобайтовыми символами, как если бы вызывались mbrtowc или wcrtomb с состоянием преобразования, описываемым потоком. В отличие от многобайтовых строк, допустимых в программе, многобайтовые последовательности символов в файле могут содержать встроенные нули и не обязаны начинаться или заканчиваться в начальном состоянии сдвига.

Состояние преобразования потока с широкой ориентацией устанавливается локализацией C, которая установлена в момент задания ориентации потока.

Бинарный и текстовый режимы

Текстовый поток — это упорядоченная последовательность символов, которая может быть скомпонована в строки; строка может быть разложена на ноль или более символов плюс завершающий символ ' \n ' (“перевод строки”). Требуется ли для последней строки завершающий символ ' \n ' — определяется реализацией. Кроме того, символы могут добавляться, изменяться или удаляться при вводе и выводе для соответствия соглашениям представления текста в ОС (в частности, потоки C в ОС Windows преобразуют ' \n ' в ' \r \n ' при выводе и преобразуют ' \r \n ' в ' \n ' при вводе).

Данные, прочитанные из текстового потока, гарантированно будут сравниваться как равные данным, которые ранее были записаны в этот поток, только если каждое из следующих условий выполняется:

  • Данные состоят только из печатных символов и/или управляющих символов ' \t ' и ' \n ' (в частности, в ОС Windows символ ' \0 x1A' завершает ввод).
  • Ни один символ ' \n ' не предшествует непосредственно символам пробела (такие пробельные символы могут исчезать, когда такой вывод впоследствии считывается как ввод).
  • Последний символ - ' \n ' .

Бинарный поток — это упорядоченная последовательность символов, которая может прозрачно записывать внутренние данные. Данные, считанные из бинарного потока, всегда равны данным, которые ранее были записаны в этот поток, за исключением того, что реализация может добавлять неопределенное количество нулевых символов в конец потока. Широкий бинарный поток не обязательно должен заканчиваться в начальном состоянии сдвига.

Примечания

POSIX явно требует, чтобы фасет LC_CTYPE текущей установленной локали C сохранялся в объекте FILE в момент, когда ориентация потока становится широкой; POSIX требует, чтобы этот фасет LC_CTYPE использовался для всех последующих операций ввода-вывода на этом потоке до изменения ориентации, независимо от любых последующих вызовов setlocale .

Предполагается, что каждая строка текста должна состоять из данных, которые по сути читаемы человеком. Реализации POSIX не различают текстовые и двоичные потоки (не существует специального отображения для ' \n ' или любых других символов).

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.21 Ввод/вывод <stdio.h> (стр: 217-247)
  • 7.29 Расширенные утилиты многобайтовых и широких символов <wchar.h> (стр: 295-325)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.21 Ввод/вывод <stdio.h> (стр: 296-339)
  • 7.29 Расширенные утилиты многобайтовых и широких символов <wchar.h> (стр: 402-446)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.19 Ввод/вывод <stdio.h> (стр: 262-305)
  • 7.24 Расширенные многобайтовые и широкосимвольные утилиты <wchar.h> (стр: 348-392)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.9 ВВОД/ВЫВОД <stdio.h>

Смотрите также

выражение типа FILE * связанное с входным потоком
выражение типа FILE * связанное с выходным потоком
выражение типа FILE * связанное с потоком вывода ошибок
(макроконстанта)