logo
Posobie_Ravino_Atamanov

2.5.5.10. Ввод-вывод данных через внешний файл

При работе с программой часто требуется запомнить последний вариант введенных исходных данных. Это особенно актуально, если необходимо ввести большое количество исходных данных. Сделать это можно, например, используя текстовые файлы.

Для доступа к файлам чаще всего используется специальная файловая переменная. Она связывается с указанным файлом процедурой AssignFile. Эта процедура имеет синтаксис:

procedure AssignFile(var F: File, S: string);

где F ‑ файловая переменная (для удобства пользования в курсовой работе следует использовать для ввода данных из файла файловые переменные с именами Fr, Fr1, Fr2 и т.д., а для записи данных в файл – переменные Fw, Fw1, Fw2 и т.д.); S ‑ строка, содержащая имя файла.

Например, оператор

AssignFile (F, 'Daten.txt');

связывают файловую переменную F с файлом Daten.txt.

Открытие, например, для ввода исходных данных, существующего файла осуществляется процедурой Reset, формат которой следующий:

procedure Reset(var Fr: File);

Файловая переменная Fr перед обращением к этой процедуре должна быть связана с файлом.

Создание и открытие нового файла, например для записи полученных результатов, осуществляется процедурой Rewrite, формат которой следующий:

procedure Rewrite(var Fw: File);

Файловая переменная Fw перед обращением к этой процедуре должна быть связана с файлом.

После выполнения различных операций чтения и записи файл должен быть закрыт процедурой CloseFile:

procedure CloseFile(var F: File);

Текстовые файлы состоят из последовательностей символов, разбитых на строки. В Delphi предопределен тип TextFile, соответствующий текстовому файлу. Таким образом, объявление файловой переменной может иметь вид:

var Fr, Fw: TextFile;

Запись данных в текстовый файл осуществляется процедурой

procedure Write(var F: TextFile;<список выражений>);

Выражения могут быть типов Char, Integer, Real, String, упакованных строк, Boolean. При этом может использоваться форматирование.

Аналогичная процедура Writeln отличается от Write только тем, что после записи пишет символ перехода на новую строку, т.е. Writeln формирует одну строку.

Чтение данных из текстового файла осуществляется последовательно от его начала процедурой

procedure Read(var F:TextFile;<список переменных>);

Аналогичная процедура ReadLn отличается от Read только тем, что после чтения переводит текущую позицию в файле на новую строку. Если в процедуре ReadLn не задай список переменных, то она просто пропускает текущую строку и переходит к следующей.

Пример реализации файлового ввода-вывода данных для условия задачи, приведенного в разделе 2.5.1, представлен ниже.

Прежде всего, следует создать текстовый файл, например, с именем Daten.txt и записать в него следующие данные

1.6

1

30

0.1

1

17

15

Далее, используя событие FormCreate, присвоить переменным числовые значения из файла.

AssignFile(Fr,'Daten.txt');

Reset(Fr);

Readln(Fr,B);

Readln(Fr,vMin);

Readln(Fr,vMax);

Readln(Fr,deltaVmin);

Readln(Fr,deltaVmax);

Readln(Fr,n);

Readln(Fr,m);

CloseFile(Fr);

Затем эти значения присваиваются соответствующим компонентам для ввода исходных данных:

LabeledEdit1.Text:=FloatToStr(deltaVmin);

LabeledEdit2.Text:=FloatToStr(deltaVmax);

LabeledEdit3.Text:=IntToStr(n);

LabeledEdit4.Text:=FloatToStr(Vmin);

LabeledEdit5.Text:=FloatToStr(Vmax);

LabeledEdit6.Text:=IntToStr(m);

LabeledEdit7.Text:=FloatToStr(B);

После выполнения этих операций в компонентах LabeledEdit будут находиться значения переменных, введенных из файла. Теперь эти значения можно менять непосредственно на форме, а для того чтобы они «запомнились» в программе нужно на событие OnClick кнопки Расчет написать программный код записи измененных исходных данных в файл. Следует обратить внимание на то, что нужно указать одинаковое имя для файла ввода и вывода исходных данных:

AssignFile(Fw,'Daten.txt');

Rewrite(Fw);

WriteLn(Fw,StrToFloat(LabeledEdit7.Text(B)));

WriteLn(Fw,StrToFloat(LabeledEdit4.Text(vMin)));

WriteLn(Fw,StrToFloat(LabeledEdit5.Text(vMax)));

WriteLn(Fw,StrToFloat(LabeledEdit1.Text(deltaVmin)));

WriteLn(Fw,StrToFloat(LabeledEdit2.Text(deltaVmax)));

WriteLn(Fw,StrToInt(LabeledEdit3.Text(n)));

WriteLn(Fw,StrToInt(LabeledEdit6.Text(m)));

CloseFile(Fw);

Т.к. теперь будет всегда запоминаться последний вариант введенных данных, то при ошибочном вводе данных, они также будут запоминаться (за исключением ситуаций, когда сработают блоки try..except или try..finally). Поэтому в программе необходимо предусмотреть восстановление данных на значения по умолчанию. Сделать это можно, например, создав кнопку По умолчанию, и записать в нее следующий программный код:

LabeledEdit1.Text:=FloatToStr(0.1);

LabeledEdit2.Text:=FloatToStr(1);

LabeledEdit3.Text:=IntToStr(17);

LabeledEdit4.Text:=FloatToStr(1);

LabeledEdit5.Text:=FloatToStr(30);

LabeledEdit6.Text:=IntToStr(15);

LabeledEdit7.Text:=FloatToStr(1.6);