netlib.narod.ru< Назад | Оглавление | Далее >

7.1. Стандартный ввод-вывод

Как уже говорилось в главе 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< Назад | Оглавление | Далее >

Сайт управляется системой uCoz