Spec-Zone.ru › C

ФAЙЛ

Определено в заголовке <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 OS преобразуют '\n' в '\r\n' при выводе и преобразуют '\r\n' в '\n' при вводе).

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

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

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

Примечания

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>

См. также

stdinstdoutstderr
выражение типа FILE* связанное со входным потоком
выражение типа FILE* связанное с выходным потоком
выражение типа FILE* связанное с потоком ошибок вывода
(макро-константа)
Документация C++ для FILE

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/io/FILE

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API