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

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

  • Данные состоят только из печатаемых символов и/или управляющих символов '\t' и '\n' (в частности, в Windows OS символ '\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/w/cpp/io/c/FILE

Spec-Zone.ru

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