
- •4. Текстовые файлы и циклическое выполнение
- •4.1 Текстовые файлы
- •4.1.1. Операции над файлами.
- •4.1.2. Синтаксис и семантика файлов.
- •4.1.3. Копирование файлов
- •4.1.4. Разделение файлов.
- •4.2. Сортировка и использованием циклического выполнения.
- •4.2.1. Программа SelectSort
- •4.2.2. Структурное тестирование
- •4.2.3. Анализ SelectSort
- •4.3. Маркеры текстовых файлов
- •4.3.1. Маркер конца строки
- •4.3.2. Маркер конца файла
- •4.3.3. Копирование строк
- •Dp4.4 { Копируем f2 в f1 } и dp4.3 { Копируем f1 в output }
- •4.4. Заключение
4. Текстовые файлы и циклическое выполнение
До настоящего времени были доступны только символьные переменные. Используя текстовые файлы, данные могут сохраняться вне зависимости от их размера. Работая с файлами можно сортировать текстовые строки любой длины.
4.1 Текстовые файлы
Вводится новый тип данных CF Pascal, файл типа TEXT, он используется для хранения данных. Текстовые файлы могут хранить последовательности с любым количеством символов.
Новые идеи: файлы типа TEXT, использование файлов для хранения рабочих данных, REWRITE, RESET.
4.1.1. Операции над файлами.
INPUT и OUTPUT – стандартные идентификаторы именующие файлы которые можно читать и записывать; данные в этих файлах являются последовательностями символов.
В CF Pascal также есть переменные, данные которых являются последовательностями символов – файлы типа TEXT. Другое имя типа данных TEXT – FILE OF CHAR. Текстовые файлы могут быть созданы, туда можно записывать данные, считывать данные, они могут хранить несколько символов, чего не скажешь про переменные типа CHAR. Файлы описываются в разделе VAR c использованием стандартного слова TEXT. Например:
VAR
Ch: CHAR;
Chars: TEXT;
После того как переменная типа TEXT была создана, она должна быть приготовлена для записи с использованием выражения REWRITE, в данном случае:
REWRITE(Chars)
Или файл может быть приготовлен для чтения, возможно после записи данных, используя выражение RESET.
RESET(Chars)
Если для файла было выполнено выражение REWRITE и нет промежуточных выражений RESET, файл открыт для записи и выражения WRITE могут ссылаться на него, например:
WRITE(Chars, Ch, ‘#’);
WRITELN(Chars, Ch, Ch)
Если для файла было выполнено выражение RESET, без промежуточных выражений REWRITE, файл открыт для чтения и выражения READ могут ссылаться на него, например:
READ(Chars, Ch);
Чтение и запись файлов типа TEXT, объявленных в программе, во всех отношениях подобны чтению из INPUT и записи в OUTPUT. Значением файла открытого для чтения или записи может быть строка символов и курсор. Выражение REWRITE размещает курсор на первой позиции строки символов, где символы отсутствуют, аналогично OUTPUT после выполнения заголовка программы. Выражение RESET не изменяет данные файла и перемещает курсор в позицию первого символа, если таковой имеется, аналогично тому как инициализируется INPUT при выполнении заголовка программы.
OUTPUT всегда открыт для записи и может присутствовать в выражении WRITE. Выражения
WRITE(Ch)
и
WRITE(OUTPUT, Ch)
С точки зрения выполнения идентичны. Аналогично, INPUT всегда открыт для чтения и может быть использовано следующее выражение:
READ(Input, Ch)
4.1.2. Синтаксис и семантика файлов.
Для включения файловых операций в синтаксические и контекстные правила CFPascal, необходимы следующие изменения в синтаксических правилах 7, 12 и 13 и новое правило 29.
SR7.
<объявления> ::= VAR <список идентификаторов>: <тип>
| <объявления>;<список идентификаторов>:<тип>
SR12.
<выражение READ> ::= READ(<список идентификаторов>)
| RESET(<идентификатор>)
SR13.
<выражение WRITE> ::= WRITE(<список вывода>)
| WRITELN(<список вывода>)
| WRITELN
| REWRITE(<идентификатор>)
SR29.
<тип> ::= CHAR | TEXT
Соответствующее контекстное правило:
CR6.
Идентификатором типа TEXT является <идентификатор> описанный в разделе объявлений имеющий <тип> TEXT. Если идентификатор типа TEXT появляется в <выражении WRITE> или в <выражении READ>, он должен стоять первым в <списке идентификаторов> или <списке вывода>. Идентификатор типа TEXT, иной чем INPUT или OUTPUT должен быть описан в <объявлениях>. Только идентификаторы типа TEXT, исключая INPUT и OUTPUT, могут появляться внутри выражений RESET и REWRITE.
Переменные объявленные как TEXT должны быть подготовлены до того как к ним будут применены выражения READ и WRITE. Первой операцией должны быть REWRITE, которая делает готовит файл для записи. До REWRITE файл имеет неопределенное значение, как неинициализированная переменная типа CHAR. REWRITE может быть применено к фай Лу несколько раз, после чего каждый раз значением файловой переменной становится пустая строка. Последнее операцией примененной к файлу должно быть выражение WRITELN, после чего файл готов к применению выражения RESET, которое готовит файл для чтения. Символы, записанные в определенном порядке после REWRITE, будут считаны в том же порядке после RESET. Файл не может быть прочитан до того как туда что-либо будет записано, такая ситуация вызовет ошибку. Однако марке конца строки, который записывает в файл финальный WRITELN, будет прочитан как пробел. При выполнении следующего выражения READ программа выдаст ошибку. Операция RESET может быть применена к файлу несколько раз.