Стандартные открытые файлы
Программы могут иметь несколько открытых файлов одновременно. Максимально допустимое число открытых в программе файлов может быть различным для разных систем; как правило, оно равно 20. Число файлов, открытых для выполнения операций стандартного ввода/вывода, задается константой _NFILE во включаемом файле <stdio.h>.
Обычно имеется три стандартных открытых файла. В файле <stdio.h>, примерно в середине его текста, имеются три директивы #define, устанавливающие stdin, stdout и stderr равными адресам _iob[0], _iob[1] и _iob[2] соответственно. Массив _iob содержит информацию о потоках, открытых программой. Номер элемента массива _iob называется также дескриптором файла. По умолчанию в ОС UNIX все три стандартных открытых файла ассоциированы с терминалом.
Так как эти файлы постоянно открыты, то при использовании функций и макросов для выполнения операций ввода/вывода со стандартными потоками ввода и вывода stdin и stdout нет необходимости открывать и закрывать файлы. Например, упоминавшаяся выше функция gets() читает символы из потока стандартного ввода stdin; функция puts() записывает завершающуюся нулевым байтом цепочку символов в поток стандартного вывода stdout. Имеются и другие функции для работы с этими потоками, например, для организации посимвольного или форматного ввода/вывода и другие. Кроме упомянутых функций, имеются также функции, выполняющие операции ввода/вывода с потоками, отличными от stdin и stdout. К таким функциям относится, например, fprintf(), которая выполняет те же действия, что и функция printf(), но вывод при этом направляется в указанный поток, например, stderr. Для того, чтобы при выполнении программы операции чтения и записи выполнялись с нужными файлами, можно также воспользоваться средствами shell'а. В заключении приведем пример указания потоков ввода и вывода. Пусть требуется отделить сообщения об ошибках и обычный вывод программы, направляемый в stdout. Это может потребоваться, например, когда вывод программы будет использоваться в качестве ввода для другой программы. В таком случае для организации обычного вывода и выдачи сообщений можно использовать различные модификации одной и той же функции из пакета стандартного ввода/вывода, одна из которых направляет вывод в stdout, а другая - в указанный в качестве ее аргумента поток.