Библиотечные функции ввода-вывода точно определяются стандартом ANSI, так что они совместимы на любых системах, где поддерживается Си. Программы, которые в своем взаимодействии с системным окружением не выходят за рамки возможностей стандартной библиотеки, можно без изменений переносить с одной машины на другую.
Свойства библиотечных функций специфицированы в более чем дюжине заголовочных файлов; вам уже встречались некоторые из них, в том числе ‹stdio.h›, ‹string.h› и ‹ctype.h›. Мы не рассматриваем здесь всю библиотеку, так как нас больше интересует написание Си-программ, чем использование библиотечных функций. Стандартная библиотека подробно описана в приложении B.
7.1 Стандартный ввод-вывод
Как уже говорилось в главе 1, библиотечные функции реализуют простую модель текстового ввода-вывода. Текстовый поток состоит из последовательности строк; каждая строка заканчивается символом новой строки. Если система в чем-то не следует принятой модели, библиотека сделает так, чтобы казалось, что эта модель удовлетворяется полностью. Например, пара символов -
Простейший механизм ввода - это чтение одного символа из
int getchar(void)
В качестве результата каждого своего вызова функция
Во многих системах клавиатуру можно заменить файлом, перенаправив ввод с помощью значка ‹. Так, если программа
prog ‹ infile
предпишет программе
otherprog | prog
приведет к тому, что запустится две программы,
int putchar(int)
используется для вывода:
prog › outfile
будет направлять стандартный вывод не на экран, а в
prog | anotherprog
соединит стандартный вывод программы
Вывод, осуществляемый функцией
Любой исходный Си-файл, использующий хотя бы одну функцию библиотеки ввода-вывода, должен содержать в себе строку
#include ‹stdio.h›
причем она должна быть расположена до первого обращения к вводу-выводу. Если имя заголовочного файла заключено в угловые скобки ‹ и ›, это значит, что поиск заголовочного файла ведется в стандартном месте (например в системе UNIX это обычно директорий
Многие программы читают только из одного входного потока и пишут только в один выходной поток. Для организации ввода-вывода таким программам вполне хватит функций
#include ‹stdio.h›
#include ‹ctype.h›
main /* lower: переводит ввод на нижний регистр */
{
int с;
while ((с = getchar) != EOF)
putchar(tolower(c));
return 0;
}