Namespaces
Variants

std:: FILE

From cppreference.net
< cpp ‎ | io ‎ | c
Определено в заголовке <cstdio>
typedef /* unspecified */ FILE ;

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

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

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

Содержание

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

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

  1. Ширина символа: unset, narrow или wide.
  2. Состояние парсинга для преобразований между многобайтовыми и широкими символами (объект типа std::mbstate_t )
  3. Состояние буферизации: unbuffered, line-buffered, fully buffered.
  4. Буфер, который может быть заменён внешним, предоставленным пользователем буфером.
  5. Режим ввода-вывода: input, output или update (и ввод, и вывод).
  6. Индикатор режима binary/text.
  7. Индикатор состояния конца файла.
  8. Индикатор состояния ошибки.
  9. Индикатор позиции в файле, доступный как объект типа std::fpos_t , который для широких потоков включает состояние парсинга.
  10. (C++17) Реентерабельная блокировка, используемая для предотвращения гонки данных при одновременном чтении, записи, позиционировании или запросе позиции потока несколькими потоками выполнения.

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

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

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

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

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

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

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

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

Примечания

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

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

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

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