UNIX — универсальная среда программирования
Шрифт:
| fp=fopen(s, mode) | Открыть файл s ; значения mode "r" , "w" , "a" соответствуют чтению, записи и добавлению (при ошибке возвращается NULL) |
| c=gets(fp) | Читать символ: getchar это getc(stdin) |
| putc(c, fp) | Записать символ: putchar(c) это putc(c, stdout) |
| ungetc(c, fp) | Вернуть символ во входной файл fp ; можно вернуть не более одного символа за раз |
| scanf(fmt, a1, ...) | Читать символы из stdin в a1 , ... в соответствии с fmt . Каждый ai должен быть указателем |
| fscanf(fp,...) | Читать из файла fp |
| sscanf(s,...) | Читать из строки s |
| printf(fmt, a1, ...) | Форматировать a1 , ... в соответствии с fmt ; печатать в stdout |
| fprintf(fp, ...) | Печатать ... в файл fp |
| sprintf(s, ...) | Печатать ... в строку s |
| fqets(s, n, fp) | Читать не более n символов в s из fp (возвращается NULL по концу файла) |
| fputs(s, fp) | Печатать строку s в файл fp |
| fflush(fp) | Занести буферизованные данные выходного потока в файл fp |
| fclose(fp) | Закрыть файл fp |
| fp=popen(s, mode) | Открыть программный канал для команды s (см. fopen ) |
| pclose(fp) | Закрыть программный канал fp |
| system(s) | Запустить команду s и ждать ее окончания |
Таблица 6.4: Полезные стандартные функции ввода-вывода
Упражнение 6.11
Модифицируйте
zap
так, чтобы можно было применять любое число аргументов. В настоящем виде zap
высвечивает на экране строку, соответствующую выбранному варианту. Будет она делать это? Если нет, модифицируйте программу соответствующим образом. Подсказка: getpid(2)
. Упражнение 6.12
Постройте
fgrep(1)
на основе strindex
. Сравните время работы при сложных поисках, например 10 слов на документ. Почему fgrep
выполняется быстрее? 6.8 Диалоговая программа сравнения файлов:
idiff
Поддерживать две чем-то отличающиеся версии файла, каждая из которых содержит часть нужного вам файла, довольно распространенная проблема. Зачастую она возникает в тех случаях, когда изменения вносятся независимо двумя разными людьми. Программа
diff
подскажет вам, чем различаются файлы, но вы не получите никакой помощи, если захотите выбрать какую-то информацию из одного файла, а какую-то из другого. В этом разделе мы напишем программу
idiff
(диалоговая diff
), которая предоставляет пользователю каждую порцию выходного потока diff
и предлагает ему возможность выбора фрагментов "от и до" или их редактирования. Программа idiff
помещает выбранные фрагменты в соответствующем порядке в файл idiff.out
. Допустим, даны такие два файла:
file1: file2:
This is This is
a test not a test
of of
your our
skill ability.
and comprehension.
diff
вырабатывает следующее:
$ diff file1 file2
2c2
< a test
– --
> not a test
4,6c4,5
< your
< skill
< and comprehension.
– --
> our
> ability.
$
Диалог с
idiff
может выглядеть так:
$ idiff file1 file2
2c2
Первое различие
< a test
– --
> not a test
? >
Пользователь выбрал вторую версию 4,6с4,5
Второе различие
< your
< skill
< and comprehension.
– --
> our
> ability.
? <
Пользователь выбрал первую (<) версию
idiff output in file idiff.out
$ cat idiff.out
Выходной поток направляется в этот файл
This is
not a test of
your skill
and comprehension.
$
Если вместо
<
или >
выдан ответ е
, idiff
вызывает ed
с двумя группами уже прочитанных строк. Если вторым был ответ е
, буфер редактора выглядел бы следующим образом:
your
skill
and comprehension.
– --
our
ability.
Все, что пишется редактором обратно в файл, идет в окончательный выходной поток.
И, наконец, любая команда может быть выполнена внутри
idiff
с помощью временного выхода посредством !cmd. Технически самая трудная часть работы
diff
, и она уже выполнена. Таким образом, в задачи idiff
входит разбор выходного потока diff
, открытие, закрытие, чтение и считывание соответствующих файлов в нужное время. Главная функция idiff
поддерживает файлы и запускает процесс diff
:
/* idiff: interactive diff */
#include <stdio.h>
#include <ctype.h>
char *progname;
#define HUGE 10000 /* large number of lines */
main(argc, argv)
int argc;
char *argv[];
{
FILE *fin, *fout, *f1, *f2, *efopen;
char buf[BUFSIZ], *mktemp;
Поделиться:
Популярные книги
Тринадцатый
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
7.33
рейтинг книги
Бездна
21. Другая сторона
Фантастика:
боевая фантастика
рпг
уся
попаданцы
5.00
рейтинг книги
Черный рынок
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Книга тайн
143. Книга-загадка, книга-бестселлер
Детективы:
прочие детективы
7.50
рейтинг книги
Кодекс Охотника. Книга II
2. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
юмористическое фэнтези
5.00
рейтинг книги
Найденыш
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Неучтенный элемент. Том 11
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Барон Бранд Берс. Том 3
3. Бранд Берс
Проза:
магический реализм
5.00
рейтинг книги
Ермак. Противостояние. Книга одиннадцатая
11. Ермак
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
На границе империй. Том 10. Часть 10
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Мастер 3
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Жена по ошибке
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Наномашины, внучок! Том 2
2. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Лекарь Империи 3
3. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00