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