127
Существенны не только содержимое, но и адрес объекта типа
FILE; копия подобного объекта не обязательно является корректным
представлением потока.
И файловые дескрипторы, и потоки формируются в результате
выполнения функций открытия файлов, которые должны
предшествовать операциям ввода/вывода. Имеется, однако, три
предопределенных потока: стандартный ввод, стандартный вывод и
стандартный протокол, открываемые окружением времени выполнения
еще перед началом работы C-программ. Для обращения к ним служат
указатели на объекты типа FILE с именами, соответственно, stdin, stdout
и stderr.
При открытии файлов указывается вид последующих операций
ввода/вывода: чтение, запись, модификация (чтение и запись),
добавление (запись в конец). Вид операций должен быть согласован с
правами доступа к файлу; в противном случае открытие закончится
неудачей.
Если файл поддерживает запросы на позиционирование (таковы
обычные файлы в противоположность, например, символьным
специальным, соответствующим терминалам), то после открытия
индикатор текущей позиции устанавливается в начало (на нулевой байт)
при условии, что файл не открывали на добавление; в этом случае от
реализации зависит, будет ли индикатор указывать на начало или конец
файла.
В дальнейшем индикатор текущей позиции смещается под
воздействием операций чтения, записи и позиционирования, чтобы
упростить последовательное продвижение по файлу.
Потоки могут быть полностью буферизованными,
буферизованными построчно и небуферизованными. В первом случае
передача байт из файла/в файл осуществляется преимущественно
блоками, когда буфер оказывается заполненным. При построчной
буферизации передача данных также осуществляется блоками, по
достижении символа перевода строки или заполнении буфера. При
отсутствии буферизации байты передаются по возможности без
задержек.
Стандартом C99 [5] предусмотрены байтные и широкие символы.
Соответственно, в стандарте POSIX-2001 введено понятие ориентации
потока, которая может быть широкой или байтной. Задает ориентацию
первая после открытия файла ввода/вывода операция. Если вначале
применяется функция ввода/вывода широких символов, поток получает
широкую ориентацию; в противном случае – байтную. Сменить
ориентацию можно только повторным открытием файла; применяемые к
потоку функции ввода/вывода должны соответствовать его ориентации.
После завершения работы с файлом его необходимо закрыть. При
этом не только разрывается связь между файлами с одной стороны и