- •4. Текстовые файлы и циклическое выполнение
- •4.1 Текстовые файлы
- •4.1.1. Операции над файлами.
- •4.1.2. Синтаксис и семантика файлов.
- •4.1.3. Копирование файлов
- •4.1.4. Разделение файлов.
- •4.2. Сортировка и использованием циклического выполнения.
- •4.2.1. Программа SelectSort
- •4.2.3. Анализ SelectSort
- •4.2.2. Структурное тестирование
- •4.3. Маркеры текстовых файлов
- •4.3.1. Маркер конца строки
- •4.3.2. Маркер конца файла
- •4.3.3. Копирование строк
- •Dp4.4 { Копируем f2 в f1 } и dp4.3 { Копируем f1 в output }
- •4.4. Заключение
4.1.3. Копирование файлов
Типичная операция над файлами копирует один файл в другой. Программа CopyTwice копирует INPUT в OUTPUT через промежуточный рабочий файл Chars. Первый шаг – копирование INPUT в Chars, второй шаг – копирование Chars в OUTPUT.
DP 1
PROGRAM CopyTwice (INPUT, OUTPUT);
{Копирует символы, предшествующие # из INPUT в OUTPUT
Программа выдаст ошибку, если в INPUT отсутствует #}
VAR
Ch: CHAR;
Chars: TEXT; {Рабочий файл}
BEGIN {CopyTwice}
{Копировать INPUT в Chars}
{Копировать Chars в OUTPUT}
END. {CopyTwice}
DP 1.1
BEGIN {Копировать INPUT в Chars}
REWRITE(Chars); {Готовим Chars для записи}
READ(INPUT, Ch);
WHILE Ch <> ‘#’
DO
BEGIN
WRITE(Chars, Ch);
READ(INPUT, Ch)
END;
WRITELN(Chars, ‘#’) {Закрыть Chars маркером конца строки}
END
DP 1.2
BEGIN {Копировать Chars в OUTPUT}
RESET(Chars); {Готовим Chars для чтения}
READ(Chars, Ch);
WHILE Ch <> ‘#’
DO
BEGIN
WRITE(OUTPUT, Ch);
READ(Chars, Ch)
END;
WRITELN(OUTPUT)
END
Без маркера конца входной последовательности, который DP 1.1 помещает в конец промежуточного файла, DP 1.2 не сможет остановить свое выполнение.
Собираем разделы проекта.
DP 1A
PROGRAM CopyTwice (INPUT, OUTPUT);
{Копирует символы, предшествующие # из INPUT в OUTPUT}
VAR
Ch: CHAR;
Chars: TEXT; {Рабочий файл}
BEGIN {CopyTwice}
BEGIN {Копировать INPUT в Chars}
REWRITE(Chars); {Готовим Chars для записи}
READ(INPUT, Ch);
WHILE Ch <> '#'
DO
BEGIN
WRITE(Chars, Ch);
READ(INPUT, Ch)
END;
WRITELN(Chars, '#') {Закрыть Chars маркером конца строки}
END
BEGIN {Копировать Chars в OUTPUT}
RESET(Chars); {Готовим Chars для чтения}
READ(Chars, Ch);
WHILE Ch <> '#'
DO
BEGIN
WRITE(OUTPUT, Ch);
READ(Chars, Ch)
END;
WRITELN(OUTPUT)
END
END. {CopyTwice}
Выполнение:
INPUT: ABCD#
OUTPUT: ABCD
INPUT: 1#ABCD
OUTPUT: 1
INPUT: Four score and seven years ago#
OUTPUT: Four score and seven years ago
[восемьдесят семь лет назад]
Комментарий, описывающий поведение программы CopyTwice
{Копирует символы, предшествующие # из INPUT в OUTPUT
Программа выдаст ошибку, если в INPUT отсутствует #}
ничего не говорит о файлах типа CHAR. Комментарий для всей программы должен описывать ее поведение доступное извне и не вдаваться в детали реализации, поскольку он предназначен для того, кто планирует использовать программу а не разбираться как она работает. Далее комментарии освещают детали реализации. Этот обобщается в принципе написания комментариев:
Используйт е имена переменных в комментариях только после того как они были объявлены.
Соблюдающий это правило автоматически размещает информацию о том как работает программа за комментариями, предназначенными для того чтобы рассказать что она делает.
Частичная таблица выполнения показывает содержимое файлов во время выполнения.
После выполнения |
Условие |
INPUT |
OUTPUT |
Chars |
Ch |
REWRITE(Chars) READ(INPUT, Ch) WHILE Ch <> ‘#’ BEGIN WRITE(Chars, Ch) READ(INPUT, Ch) END WHILE Ch <> ‘#’ BEGIN WRITE(Chars, Ch) READ(INPUT, Ch) END WHILE Ch <> ‘#’ WRITELN(Chars, '#') RESET(Chars) READ(Chars, Ch); WHILE Ch <> ‘#’ DO BEGIN WRITE(OUTPUT, Ch) READ(Chars, Ch) END WHILE Ch <> ‘#’ DO BEGIN WRITE(OUTPUT, Ch) READ(Chars, Ch) END WHILE Ch <> ‘#’ WRITELN(OUTPUT) END. |
TRUE
TRUE
FALSE
TRUE
TRUE
FALSE |
AB# AB# AB# AB# AB# AB# AB# AB# AB# AB# AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB#_ AB# |
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ A_ A_ A_ A_ A_ A_ AB_ AB_ AB_ AB_ AB/_ AB |
_ _ _ _ A_ A_ A_ A_ A_ AB_ AB_ AB_ AB_ AB#/_ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/ AB#/
|
? A A A A B B B B B # # # # # A A A A A B B B B B B # # # #
|
