Работа с файлами в Object Pascal осуществляется через файловые переменные.

Лабораторная работа № 14

Обработка файлов

Теоретические пояснения

С точки зрения Object Pascal существуют три категории файлов: текстовые, типизированные и файлы без типа.

Мы будем рассматривать только текстовые файлы.

Файлы, состоящие из строк, называются текстовыми. Компоненты таких файлов могут быть символьного, строкового и арифметического типа.

Признак конца строки (код #13) вставляется клавишей Enter при вводе строк с клавиатуры или оператором WriteLnпри записи данных из программы.

Признаком конца файла является символ #26, на экране может отображаться как ^Z.

Текстовые файлы можно обрабатывать только последовательно. Ввод и вывод нельзя осуществлять одновременно для одного и того же файла.

Работа с файлами в Object Pascal осуществляется через файловые переменные.

Такие переменные для текстовых файлов объявляются следующим образом:

Var<идентификатор файловой переменной>: TextFile;

Например,

VarF1,F2: TextFile

означает, что мы можем работать одновременно с двумя текстовыми файлами, обращаясь к ним по именам F1 и F2, которые и являются файловыми переменными.

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

AssignFile(<идентификатор файловой переменной>, '<имя файла>') – связывает файловую переменную с именем файла на диске. В качестве имен файлов можно использовать стандартные имена:

- Con – консоль, т.е. клавиатура и дисплей;

- Prn – принтер;

- Nul – "пустой" файл. При чтении из Nul сразу же обнаруживается конец файла, а при записи ничего не происходит.

Append(<идентификатор файловой переменной>) – открывает существующий файл для последовательной записи (добавления) данных в конец файла. Если файл был открыт, то сначала он закрывается, а затем заново открывается.

Rewrite(<идентификатор файловой переменной>) – создаёт и открывает файл для записи данных. Если файл с указанным именем уже существует на диске, то он удаляется и создается новый.

Reset(<идентификатор файловой переменной>) – открывает существующий файл только для чтения. Если файл был открыт, то сначала он закроется, а затем заново откроется.

Read(<идентификатор файловой переменной>, <список переменных>) – читает информацию из файла в переменные, указанные в списке. Процедура чтения зависит от типа переменной, стоящей в списке.

- Если очередная переменная – символьного типа, то в нее помещается один следующий символ из файла (включая EOLn, EOF).

- Если очередная переменная – арифметического типа, то далее считывается арифметические символы до появления пробелов, табуляции, EOLn или EOF.

- При чтении данных в строковую переменную передаются все символы до появления маркеров EOLn или EOF, маркер в строку не заносится.

После последнего прочитанного символа запоминается текущая позиция в файле. Новый оператор Read будет читать не с начала файла, а с текущей позиции.

ReadLn(<идентификатор файловой переменной>, <список переменных>) – отличается от Read тем, что после чтения указанных переменных пропускаются все символы до конца строки и осуществляется переход к новой строке, начало которой становится текущей позицией.

ReadLn(<идентификатор файловой переменной>) без списка переменных вызывает продвижение текущей позиции в файле к началу следующей строки.

Write(<идентификатор файловой переменной>,<список переменных и выражений>) – записывает информацию в конец файла из указанных в списке переменных. Для символьных, арифметических, строковых и логических переменных выводятся их значения в соответствие с заданным форматом.

WriteLn(<идентификатор файловой переменной>, <список переменных и выражений>) – отличается от Write тем, что после вывода всех переменных в файл записывает маркер конца строки – EOLn.

CloseFile(<идентификатор файловой переменной>) – закрывает файл и, если он был открыт для записи, – освобождает связанный с ним буфер.

Файл, открытый для записи, обязательно надо закрыть, т.к. при этом дозаписываются данные, хранящиеся в буфере. В противном случае эти данные могут быть потеряны, а буфер будет недоступен для записи новых файлов.

Пример

Пусть файл example.txt содержит текст:

Пример:

2 + 3.5Е01 равно:

Необходимо прочитать арифметические данные из второй строки, операцию между ними, вычислить результат и дописать его в третью строку.

Соответствующая часть программы будет иметь вид:

Var

N1,N2,res : Double; {для чтения данных}

StrSgn : String[3]; { для строки с операцией}

F : TextFile; {файловая переменная}

Begin

AssignFile(F,'example.txt'); {Связать переменную F с файлом example.txt}

Reset(F); {Открыть файл example.txt для чтения}

ReadLn(F); {Пропустить слово "пример"}

Read(F,N1,StrSgn,N2); {Прочитать данные и строку операции}

Append(F); {Закрыть и открыть файл для добавления}

WriteLn(F); {Перейти на новую (третью) строку}

CaseSgn[2] of{Взять операцию – второй символ в строке}

’+’ : res := N1+N2;

’-’ : res := N1-N2;

’*’ : res := N1*N2;

’/’ : res := N1/N2;

end;

Write(F, FormatFloat('#.###E+00', res));

CloseFile(F);

end;

После работы данного блока программы содержимое файла example.txt примет вид:

Пpимеp:

2+3.5E01 равно:

3.7E+01