Книга: Язык программирования Си. Издание 3-е, исправленное
7.1 Стандартный ввод-вывод
7.1 Стандартный ввод-вывод
Как уже говорилось в главе 1, библиотечные функции реализуют простую модель текстового ввода-вывода. Текстовый поток состоит из последовательности строк; каждая строка заканчивается символом новой строки. Если система в чем-то не следует принятой модели, библиотека сделает так, чтобы казалось, что эта модель удовлетворяется полностью. Например, пара символов - возврат-каретки и перевод-строки - при вводе могла бы быть преобразована в один символ новой строки, а при выводе выполнялось бы обратное преобразование.
Простейший механизм ввода - это чтение одного символа из стандартного ввода (обычно с клавиатуры) функцией getchar:
int getchar(void)
В качестве результата каждого своего вызова функция getchar возвращает следующий символ ввода или, если обнаружен конец файла, EOF. Именованная константа EOF (аббревиатура от end of file - конец файла) определена в ‹stdio.h›. Обычно значение EOF равно -1, но, чтобы не зависеть от конкретного значения этой константы, обращаться к ней следует по имени (EOF).
Во многих системах клавиатуру можно заменить файлом, перенаправив ввод с помощью значка ‹. Так, если программа prog использует getchar, то командная строка
prog ‹ infile
предпишет программе prog читать символы из infile, а не с клавиатуры. Переключение ввода делается так, что сама программа prog не замечает подмены; в частности строка "‹ infile" не будет включена в аргументы командной строки argv. Переключение ввода будет также незаметным, если ввод исходит от другой программы и передается конвейерным образом. В некоторых системах командная строка
otherprog | prog
приведет к тому, что запустится две программы, otherprog и prog, и стандартный выход otherprog поступит на стандартный вход prog. Функция
int putchar(int)
используется для вывода: putchar(c) отправляет символ c в стандартный вывод, под которым по умолчанию подразумевается экран. Функция putchar в качестве результата возвращает посланный символ или, в случае ошибки, EOF. То же и в отношении вывода: с помощью записи вида › имя-файла вывод можно перенаправить в файл. Например, если prog использует для вывода функцию putchar, то
prog › outfile
будет направлять стандартный вывод не на экран, а в outfile. А командная строка
prog | anotherprog
соединит стандартный вывод программы prog со стандартным вводом программы anotherprog.
Вывод, осуществляемый функцией printf, также отправляется в стандартный выходной поток. Вызовы putchar и printf могут как угодно чередоваться, при этом вывод будет формироваться в той последовательности, в которой происходили вызовы этих функций.
Любой исходный Си-файл, использующий хотя бы одну функцию библиотеки ввода-вывода, должен содержать в себе строку
#include ‹stdio.h›
причем она должна быть расположена до первого обращения к вводу-выводу. Если имя заголовочного файла заключено в угловые скобки ‹ и ›, это значит, что поиск заголовочного файла ведется в стандартном месте (например в системе UNIX это обычно директорий /usr/include).
Многие программы читают только из одного входного потока и пишут только в один выходной поток. Для организации ввода-вывода таким программам вполне хватит функций getchar, putchar и printf, а для начального обучения уж точно достаточно ознакомления с этими функциями. В частности, перечисленных функций достаточно, когда требуется вывод одной программы соединить с вводом следующей. В качестве примера рассмотрим программу lower, переводящую свой ввод на нижний регистр:
#include ‹stdio.h›
#include ‹ctype.h›
main() /* lower: переводит ввод на нижний регистр */
{
int с;
while ((с = getchar()) != EOF)
putchar(tolower(c));
return 0;
}
Функция tolower определена в ‹ctype.h›. Она переводит буквы верхнего регистра в буквы нижнего регистра, а остальные символы возвращает без изменений. Как мы уже упоминали, "функции" вроде getchar и putchar из библиотеки ‹stdio.h› и функция tolower из библиотеки ‹ctype.h› часто реализуются в виде макросов, чтобы исключить накладные расходы от вызова функции на каждый отдельный символ. В параграфе 8.5 мы покажем, как это делается. Независимо от того, как на той или иной машине реализованы функции библиотеки ‹ctype.h›, использующие их программы могут ничего не знать о кодировке символов.
Упражнение 7.1. Напишите программу, осуществляющую перевод ввода с верхнего регистра на нижний или с нижнего на верхний в зависимости от имени, по которому она вызывается и текст которого находится в arg[0].
- 14.1.4. Стандартный ввод и вывод
- 4.4. Ввод и вывод
- Глава 7. Ввод и вывод
- Перенаправление ввода
- Вывод на экран текстовых строк
- 14.1.2. Перехват вывода программы
- ГЛАВА 5 ВВОД И ВЫВОД
- 2.1.4. Стандартный ввод-вывод
- Пример: функция str_echo, использующая стандартный ввод-вывод
- 14.8. Сокеты и стандартный ввод-вывод
- Стандартные потоки: stdin, stdout, stdeir, stdaux, stdprn.
- 9.5. Пример: двусторонние каналы в gawk