этого файла и открытию его вновь, но уже для добавления файла.
Дополнительные процедуры и функции для работы с файлами.
Выше были рассмотрены процедуры инициации файлов. Рассмотрим дополнительные процедуры и функции. Процедура CLORE. Закрывает файл, однако связь файловой переменой с именем файла, установленная ранее процедурой ASSIGN сохраняется.
Формат обращения:
CLORE (<ф.п.>);
Процедура RENAME. Переименовывает файл. Формат обращения:
RENAME (<ф.п.>, < новое имя>);
Здесь <новое имя> - строковое выражение, содержащее новое имя файла. Перед выполнением данной процедуры необходимо закрыть файл.
Процедура ERASE. Уничтожает файл. Формат обращения:
ERASE (<ф.п.>);
Перед выполнением данной процедуры файл должен быть закрыт.
В Turbo Pascal существует еще множество дополнительных процедур и функций (FLUSH, EOF, GETDIR, MKDIR, RMDIR и т.д.), рассмотренных в соответствующей литературе.
Здесь же рассмотрим только процедуры READ, WRITE и функцию EOF.
Процедура READ. Предназначена для считывания в программу данных из текстового файла (символов, строк и чисел). Формат обращения:
READ (<ф.п.>, <сп.ввода>); или READ (< сп. ввода>);
Здесь <сп. ввода> - список ввода: последовательность из одной или более переменных типа CHAR, STRING, а та же любого целого или вещественного типа.
Рассмотрим пример: пусть имеется программа, в которой имеются следующее описание переменных:
Var
Salary: Real;
Name: String; Separator: Char; My Data: Text;
Здесь, последняя строка объявляет переменную MyData, относящуюся к типу TEXT. Тип TEXT – это стандартный тип для текстовых файлов.
Далее, если в программе будет:
Read ( MyData, Salary, Separator, Name);
то этот оператор будет считывать три элемента данных из файла MyData, отправляя первый из них в переменную Salary, второй - в Separator и третью – в Name.
При этом, Turbo Pascal «знает» откуда ему с помощью этого оператора считывать данные, т.к. самый первый параметр оператора Read представляет собой переменную типа TEXT и Turbo Pascal считывает данные из файла соответствующего этой переменой ( в противном случае данные считываются с клавиатуры).
Заметим, что для считывания множества элементов из файла необходимо использовать оператор цикла.
Процедура READLN. Данная процедура идентична процедуре Read за исключением того, что после считывания последней переменной оставшаяся часть строки до маркера EOLN пропускается, поэтому следующее обращение к Readln или Read начинается с первого символа новой троки.
Процедуры WRITE и WRITELN. Обеспечивают вывод информации из программы в текстовый файл или передачу ее на логические устройства. Формат обращения:
WRITE (< ф.п. >, <сп. вывода>); или WRITE (<сп. вывода>); Здесь <сп.вывода>- список вывода: последовательность из одного или более выражений типа CHAR, STRING и т.д.
При этом, файловая переменная должна быть предварительно описана как переменная типа TEXT и связана с именем файла или логическим устройством процедурой ASSIGN. Если <ф.п.> отсутствует, то процедура вывода будет автоматически осуществлена на экран дисплея.
Функция EOF. Логическая функция, тестирующая конец файла. Возрастает – TRUE? Если файловый указатель стоит в конце файла. При записи это означает, что очередной компонент будет добавлен в конце файла, при чтении – это файл исчерпан. Формат обращения:
EOF (<ф.п>): BOOLEAN;
Рассмотрим конкретную программу, в которой осуществляется считывание из исходного файла, содержащего целые числа (по одному числу в строке) и записывает каждое число, вместе с его квадратным корнем и квадратом, в выходной файл.
Program Squ; Var
InFile, out File: Text; {входной и выходной файл} InFileName: String; {имя входного файла}
Next Num: Real; {следующие число}
Begin
{Подготовка файлов для записи и считывания} Write (‗Введите имя файла‘);
Readln (InFileName); {ввести имя для INFile} Assign (InFile, InFileName);
Reset (InFile); {открытие InFile для считывания}
Assign (OutFile,‘ Squares.Txt‘);
Rewrite (OutFile); {открытие OutFile для записи}
{Запись в выходной файл «шапки» будущей таблицы}
Writeln (OutFile,‘N‘:10, ‗корень‘:15, ‗квадрат‘:15); {Считывание каждого числа из входного файла и запись каждой строки в выходной файл.}
While not EOF (InFile) do Begin
Readln (InFile, Next Num); {Следующе число}
Writeln (OutFile, NextNum: 10:2
Sqrt (NextNum):15:2, Sqr (NextNum):15:2);
End;
{закрытие файла} Cloze (InFile);
Cloze (OutFile);
Writeln (‗Таблица корней и квадратов‘; ‗Выведены в файл Squares.txt.‘);
end.
Работа программы (после запуска) начинается со считывания в переменную InFileName, принадлежащую типу String, полного имени файла с входной информацией. После выхода из цикла, файлы закрываются, и имя выходного файла (Squares.txt) выводится на экран, чтобы пользователь программы знал, где искать результаты работы программы. Обычно, имея дело с текстовым файлами, программисты используют расширения TXT (что соответствует TEXT) и DAT(что соответствует Data).
Пробный запуск программы, результаты которого: <Введите имя файла >Numbers.txt
Таблица корней и квадратов выведена в файл Squares.txt показывает, что программа выводит на экран две строки. Первая из них представляет собой приглашение, в ответ на которое пользователю следует с клавиатуры ввести внешнее имя файла, содержащего входную информацию (Numbers.txt). А вторая строка выводит имя выходного файла (Squares.txt), которое задает второй оператор Assign в программе.
После открытия файлов, программа записывает в выходной файл заголовок будущей таблицы. Затем начинается выполнение цикла while, в котором оператор Readl считывает каждое число из файла с входной информацией, а оператор
Writeln записывает в следующую строку выходного файла три результата (число, квадратный корень и квадрат). Хотя число (значащих) символов в выводимой строке может варьироваться, программа всегда записывает в эту строчку 40 символов, включая символ <eoln> (т.е. если символ меньше в строку добавляется нужное число пробелов).
Заметим, что числа, которые считываются в выходной файл, не выводится на экран дисплея. Кроме того, следует отметить, что внутри цикла нет необходимости выводить на экран приглашение, т.к. элементы данных в этом случае не вводится интерактивно.
Обратим внимание на то, что при использовании функции EOF для управления повторением цикла, никакого предварительного считывания не требуется. Взамен, оператор Readln внутри цикла считывает все строки данных, включая первую. Если файл окажется пустым, цикл While не выполняется и оба файла закрываются. В этом случае выходной файл будет содержать только заголовок таблицы, который туда записаны.
В таблице 4.2.3. показан пример файла с входными данными (левый столбец) и пример выходного файла (три столбца справа).
Файл Numbers.txt |
Файл Squares.txt |
||
|
N |
квадратичный |
квадрат<eoln> |
|
|
корень |
|
100<eoln> |
100.00 |
10.00 |
10000<eoln> |
4.00 <eoln><eof> |
4.00 |
2.00 |
16.00<eoln><eof> |