Spec-Zone.ru › C++

std::FILE

Определён в заголовочном файле <cstdio>
typedef /* unspecified */ FILE;

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

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

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

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

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

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

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

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

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

Двоичный и текстовый режимы

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

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

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

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

Примечания

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

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

См. также

basic_streambuf
абстрагирует необработанное устройство
(шаблон класса)
basic_filebuf
реализует необработанное файловое устройство
(шаблон класса)
stdinstdoutstderr
выражение типа FILE*, связанное с потоком ввода
выражение типа FILE*, связанное с потоком вывода
выражение типа FILE*, связанное с потоком вывода ошибок
(макрос-константа)
Документация C для FILE

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

Spec-Zone.ru

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