FILE
|
Определено в заголовочном файле
<stdio.h>
|
||
|
typedef
/* unspecified */
FILE
;
|
||
Каждый
FILE
объект обозначает поток C.
Стандарт C не определяет, является ли
FILE
полным типом объекта. Хотя копирование допустимого
FILE
может быть возможным, использование указателя на такую копию в качестве аргумента для функции ввода-вывода вызывает неопределённое поведение. Другими словами,
FILE
может быть семантически некопируемым.
Потоки ввода-вывода могут использоваться как для неформатированного, так и для форматированного ввода и вывода. Кроме того, функции, обрабатывающие ввод и вывод, также могут быть чувствительными к локали, так что преобразования широких/многобайтовых символов выполняются по мере необходимости.
Содержание |
Состояние потока
Помимо специфической для системы информации, необходимой для доступа к устройству (
например,
файловый дескриптор POSIX), каждый объект
FILE
прямо или косвенно содержит следующее:
- (C95) Ширина символа: не установлена, узкая или широкая.
- (C95) Состояние парсинга для преобразований между многобайтовыми и широкими символами (объект типа mbstate_t )
- Состояние буферизации: без буферизации, построчная буферизация, полная буферизация.
- Буфер, который может быть заменен внешним, предоставленным пользователем буфером.
- Режим ввода-вывода: ввод, вывод или обновление (и ввод, и вывод).
- Индикатор двоичного/текстового режима.
- Индикатор состояния конца файла.
- Индикатор состояния ошибки.
- Индикатор позиции в файле, доступный как объект типа fpos_t , который для широких потоков включает состояние парсинга.
- (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 * связанное с потоком вывода ошибок (макроконстанта) |
|
|
Документация C++
для
FILE
|
|