Лабораторная работа № 14
Обработка файлов
Теоретические пояснения
С точки зрения Object Pascal существуют три категории файлов: текстовые, типизированные и файлы без типа.
Мы будем рассматривать только текстовые файлы.
Файлы, состоящие из строк, называются текстовыми. Компоненты таких файлов могут быть символьного, строкового и арифметического типа.
Признак конца строки (код #13) вставляется клавишей Enter при вводе строк с клавиатуры или оператором WriteLn при записи данных из программы.
Признаком конца файла является символ #26, на экране может отображаться как ^Z.
Текстовые файлы можно обрабатывать только последовательно. Ввод и вывод нельзя осуществлять одновременно для одного и того же файла.
Работа с файлами в Object Pascal осуществляется через файловые переменные.
Такие переменные для текстовых файлов объявляются следующим образом:
Var <идентификатор файловой переменной>: TextFile;
Например,
Var F1,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); {Перейти на новую (третью) строку}
Case Sgn[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