Чтение онлайн

на главную - закладки

Жанры

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;

Поделиться:
Популярные книги

Тринадцатый

NikL
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
7.33
рейтинг книги
Тринадцатый

Бездна

Кораблев Родион
21. Другая сторона
Фантастика:
боевая фантастика
рпг
уся
попаданцы
5.00
рейтинг книги
Бездна

Черный рынок

Вайс Александр
6. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Черный рынок

Книга тайн

Харпер Том
143. Книга-загадка, книга-бестселлер
Детективы:
прочие детективы
7.50
рейтинг книги
Книга тайн

Кодекс Охотника. Книга II

Винокуров Юрий
2. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
юмористическое фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга II

Найденыш

Шмаков Алексей Семенович
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Найденыш

Неучтенный элемент. Том 11

NikL
11. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 11

Барон Бранд Берс. Том 3

Limonad
3. Бранд Берс
Проза:
магический реализм
5.00
рейтинг книги
Барон Бранд Берс. Том 3

Ермак. Противостояние. Книга одиннадцатая

Валериев Игорь
11. Ермак
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Ермак. Противостояние. Книга одиннадцатая

На границе империй. Том 10. Часть 10

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 10

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Наномашины, внучок! Том 2

Новиков Николай Васильевич
2. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, внучок! Том 2

Лекарь Империи 3

Карелин Сергей Витальевич
3. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи 3