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

7.7. Ввод и вывод строк

В стандартной библиотеке имеется функция ввода fgets, аналогичная функции getline, которой мы пользовались в предыдущих главах.

  char *fgets(char *line, int maxline, FILE *fp)

Функция fgets читает следующую строку ввода (включая и символ новой строки) из файла fp в массив символов line, причем она может прочитать не более maxline – 1 символов. Введенная строка дополняется символом '\0'. Обычно fgets возвращает line, а по исчерпании файла или в случае ошибки — NULL. (Наша функция getline возвращала длину строки, которой мы потом пользовались, и нуль в случае конца файла.)

Функция вывода fputs пишет строку (которая может и не заканчиваться символом новой строки) в файл.

  int fputs(char *line, FILE *fp)

Эта функция возвращает EOF, если возникла ошибка, и неотрицательное значение в противном случае.

Библиотечные функции gets и puts подобны функциям fgets и fputs. Отличаются они тем, что работают только со стандартными файлами stdin и stdout, и кроме того, gets отбрасывает завершающий символ '\n', а puts его добавляет.

Чтобы показать, что ничего особенного в функциях вроде fgets и fputs нет, мы приводим их здесь в том виде, в каком они существуют в стандартной библиотеке на нашей системе.

  /* fgets: получает не более n символов из iop */
  char *fgets(char *s, int n, FILE *iop)
  {
      register int c;
      register char *cs;

      cs = s;
      while (--n > 0 && (c = getc(iop)) != EOF)
          if ((*cs++ = c) == '\n')
              break;
      *cs = '\0';
      return (c == EOF && cs == s) ? NULL : s;
  }

  /* fputs: посылает строку s в файл iop */
  int fputs(char *s, FILE *iop)
  {
      int c;

      while (c = *s++)
          putc(c, iop);
      return ferror(iop) ? EOF : 0;
  }

Стандарт определяет, что функция ferror возвращает в случае ошибки ненулевое значение; fputs в случае ошибки возвращает EOF, в противном случае — неотрицательное значение.

С помощью функции fgets легко реализовать нашу функцию getline:

  /* getline: читает строку, возвращает ее длину */
  int getline(char *line, int max)
  {
      if (fgets(line, max, stdin) == NULL)
          return 0;
      else
          return strlen(line);
  }

Упражнение 7-6


Напишите программу, сравнивающую два файла и печатающую первую строку, в которой они различаются.



Упражнение 7-7


Модифицируйте программу поиска по образцу из главы 5 таким образом, чтобы она брала текст из множества именованных файлов, а если имен файлов в аргументах нет, то из стандартного ввода. Будет ли печататься имя файла, в котором найдена подходящая строка?



Упражнение 7-8


Напишите программу, печатающую несколько файлов. Каждый файл должен начинаться с новой страницы, предваряться заголовком и иметь свою нумерацию страниц.



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

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