netlib.narod.ru | < Назад | Оглавление | Далее > |
Как уже говорилось в главе 1, библиотечные функции реализуют простую модель текстового ввода-вывода. Текстовый поток состоит из последовательности строк; каждая строка заканчивается символом новой строки. Если система в чем-то не следует принятой модели, библиотека сделает так, чтобы казалось, что эта модель удовлетворяется полностью. Например, пара символов — возврат каретки и перевод строки — при вводе могла бы быть преобразована в один символ новой строки, а при выводе выполнялось бы обратное преобразование.
Простейший механизм ввода — это чтение одного символа из стандартного ввода (обычно с клавиатуры) функцией getchar:
int getchar(void)
В качестве результата каждого своего вызова функция getchar возвращает следующий символ из входного потока или, если обнаружен конец файла, EOF. Именованная константа EOF (аббревиатура от end of file — конец файла) определена в файле <stdio.h>. Обычно значение EOF равно –1, но, чтобы не зависеть от конкретного значения этой константы, обращаться к ней следует по имени.
Во многих системах клавиатуру можно заменить файлом, перенаправив ввод с помощью значка <. Так, если программа 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() { int c; while ((c = getchar()) != EOF) putchar(tolower(c)); return 0; }
Функция tolower определена в файле <ctype.h>. Она переводит буквы верхнего регистра в буквы нижнего регистра, а остальные символы возвращает без изменений. Как мы уже упоминали, функции вроде getchar и putchar из библиотеки <stdio.h> и функция tolower из библиотеки <ctype.h> часто реализуются в виде макросов, чтобы исключить накладные расходы на вызов функции для каждого отдельного символа. В параграфе 8.5 мы покажем, как это делается. Независимо от того, как на той или иной машине реализованы функции библиотеки <ctype.h>, использующие их программы могут ничего не знать о кодировке символов.
Упражнение 7-1 |
Напишите программу, осуществляющую перевод вводимых симвлов с верхнего регистра на нижний или с нижнего на верхний в зависимости от имени, по которому она вызывается и текст которого находится в argv[0]. |
netlib.narod.ru | < Назад | Оглавление | Далее > |