Кафедра общей физики
ИНФОРМАТИКА
Часть 2
Основы программирования на языке PASCAL
Лабораторная работа №12
Работа с файлами
Волгоград
Составитель: Глазов С.Ю., доцент кафедры общей физики ВГПУ
Информатика. ч.2. Основы программирования на языке Pascal. Лабораторная работа №12
Работа с файлами
2007.
Лабораторная работа №12
Основы программирования на языке PASCAL
Работа с файлами.
Цель работы: изучить основные принципы работы с файлами и каталогами в Object Pascal; научиться использовать Ini – файлы для сохранения настроек программ.
Различают файлы трех видов: текстовые файлы, типизированные файлы и нетипизированные файлы.
Алгоритм работы с файлами:
- Открыть файл.
a. Связать файловую переменную с конкретным файлом на диске.
b. Указать для файла направление передачи данных (инициировать файл).
- Читать или записывать данные файла.
- Закрыть файл.
Файлы становятся доступны программе только после выполнения процедуры
AssignFile (var F: <тип файла>; FileName: string), котораясвязывает имя внешнего файла FileName с файловой переменной F.
Пример:
var FText: TextFile; {описание файловой переменной текстового файла}
FTip: File of integer; {описание переменной типизированного файла }
FNotTip: File; { описание переменной нетипизированного файла }
Begin
AssignFile(FText,’c:\result.txt’);
AssignFile(FTip,’c:\int.dat’);
AssignFile(FNotTip,’c:\data.dat’);
...
Текстовые файлы
Текстовые файлы состоят из последовательностей символов, разбитых на строки. В Object Pascal предопределен тип TextFile, соответствующий текстовому файлу и объявление файловой переменной имеет вид:
var <имя файловой переменной>: TextFile;
Работа с текстовыми фалами осуществляется процедурами и функциями файлового ввода/вывода. Основные процедуры чтения - Read, Readln, Write и Writeln.
Append (var F: TextFile) -Открывает существующий текстовый файл, связанный с файловой переменной F, для добавления в его конец.
ChDir(S: string) - изменяет текущий каталог на заданный параметром S.
CloseFile(Var F) - закрывает открытый файл, связанный с файловой переменной F.
Eof(var F): Boolean - возвращает true при достижении конца файла, связанного с файловой переменной F.
Eoln(var F: Text): Boolean - возвращает признак конца строки (true) в текстовом файле, связанном с файловой переменной F.
Erase(var F) - удаляет внешний файл, связанный с файловой переменной F.
FilePos(var F): Longint - возвращает текущую позицию типизированного или нетипизированного файла, связанного с файловой переменной F. Позиция, соответствующая началу файла - 0.
FileSize(var F):Integer - возвращает текущий размер файла, связанного с файловой переменной F. Не используется для текстовых файлов.
Flush(var F: Text) - очищает буфер выходного текстового файла, связанного с файловой переменной F.
GetDir - возвращает S - текущий каталог диска, указанного параметром D, который может равняться: 0 - текущий диск, 1 - диск A, 2 - диск B, 3 - диск C и т.д. Каталог заносится в S без заключительного символа слэш, например, "c:\mydir".
IOResult: Integer - возвращает целое значение, характеризующее код ошибки выполнение последней операции ввода/вывода.
MkDir(S: String) - создает подкаталог, заданный с полным путем параметром S.
Read(F, <список переменных>) - читает из файла, связанного с файловой переменной F, одно или более значений в одну или более переменных.
Readln(var F: Text; <список переменных>) - читает одно или более значений в одну или более переменных и переходит на начало следующей строки текстового файла, связанного с файловой переменной F.
Rename(var F; Newname) - переименовывает внешний файл, связанный с файловой переменной F, давая ему имя Newname. Переименование может сочетаться с переносом в другой каталог и на другой диск, если в Newname указан полный путь к переименованному файлу.
Reset(var F [: File;RecSize: Word]) - открывает существующий файл, связанный с файловой переменной F. Параметр RecSize задается для нетипизированных файлов и устанавливает длину записи в байтах (по умолчанию 128).
Rewrite(var F: File [; Recsize:Word]) - создает и открывает новый файл, связанный с файловой переменной F. Параметр RecSize задается для нетипизированных файлов и устанавливает длину записи в байтах (по умолчанию 128).
RmDir(S: String) - удаляет пустой подкаталог, заданный параметром S.
Seek(var F; N: Longint) - перемещает текущую позицию в типизированном или нетипизированном файле, связанном с файловой переменной F, в позицию N. Для текстовых файлов не используется.
SeekEof (Var F: Text): Boolean - Возвращает true при достижении конца текстового файла, связанного с файловой переменной F.
SeekEoln (Var F: Text): Boolean - Возвращает true при достижении конца строки текстового файла, связанного с файловой переменной F.
SetTextBuf(Var F: Text; Var Buf [; Size: Integer]) - связывает буфер ввода/вывода Buf размера Size (задавать не обязательно) с текстовым файлом, связанным с файловой переменной F.
Truncate(var F) - Усекает типизированный или нетипизированный файл, связанный с файловой переменной F, на текущей позиции.
Write(var F; <список выражений>) - записывает одно или более значений в файл, связанный с файловой переменной F.
Writeln(var F: Text;<список Выражений >) - записывает одно или более значений в файл и затем заносит маркер конца строки в текстовый файл, связанный с файловой переменной F.
Типизированные файлы
Типизированные файлы являются двоичными файлами, содержащими последовательность однотипных данных. Объявление файловых переменных таких файлов имеет вид:
var <имя файловой переменной>: file of <тип данных>;
Например:
var F: file of real;
Процедуры чтения и записи Read и Write не отличаются от соответствующих процедур для текстовых файлов. Процедур, аналогичных Readln и Writeln, для типизированных файлов нет. Зато есть процедура Seek, позволяющая перемещаться по файлу не только последовательно, как в текстовых файлах, но сразу переходить к требуемому элементу. Имеется также функция FilePos, которая возвращает текущую позицию в файле.
Нетипизированные файлы
Нетипизированные файлы - это двоичные файлы, которые могут содержать самые различные данные в виде последовательности байтов. Программист при чтении этих данных сам должен разбираться, какие байты к чему относятся.
Тип файловой переменной нетипизированного файла объявляется следующим образом:
var <имя файловой переменной>: file;
Открытие нетипизированных фалов осуществляется процедурами Reset и Rewrite, синтаксис которых несколько отличен от аналогичных процедур для других видов файлов тем, что в этих процедурах указывается размер одной записи в байтах. Вместо процедур записи и чтения Read и Write в нетипизированных файлах имеются процедуры BlockRead и BlockWrite, которые читают или записывают указанное в них число записей.
BlockRead (var F: File; var Buf; Count: Integer [; var Result: Integer]) - читает Count записей из нетипизированного файла, связанного с файловой переменной F, в буфер Buf. Если задан параметр Result, то в него возвращается число действительно прочитанных записей.
BlockWrite (var F: File; var Buf; Count: Integer [; var Result: Integer]) - записывает Count записей из буфера Buf в нетипизированный файл, связанный с файловой переменной F. Если задан параметр Result, то в него возвращается число действительно произведенных записей.
Ini – файлы
Файлы.INI - это текстовые файлы, предназначенные в 16-разрядных Windows 3.x для хранения информации о настройках различных приложений. Информация логически группируется в разделы, каждый из которых начинается оператором заголовка, заключенным в квадратные скобки. Например, [Desktop]. В строках, следующих за заголовком содержится информация, относящаяся к данному разделу, в форме:
<ключ>=<значение>
Пример фрагмента файла WIN.INI
[windows]
run=
NullPort=None
load=essdaemn.exe hpljsw.exe
device=Epson LX-100,EPSON9,LPT1:
[Desktop]
Wallpaper=(None)
TileWallpaper=0
WallpaperStyle=0
Pattern=(Нет)
[Intl]
iCountry=7
ICurrDigits=0
iCurrency=1
...
В Windows 95 и NT использование файлов.INI не поощряется и вместо типа TIniFile, инкапсулирующего свойства этих файлов, используются типы TRegistry, TRegIniFile и TRegistryIniFile, инкапсулирующие свойства системного реестра - registry.
Когда в приложении создается объект типа TIniFile, ему передается как FileName имя файла, с которым он связан. Свойства и методы TIniFile позволяют читать из файла.INI, записывать в него информацию, удалять целые разделы.
Файлы.INI, как правило, хранятся в каталоге Windows, который можно найти с помощью функции GetWindowsDirectory(Buffer, Size).
Функция GetWindowsDirectory возвращает путь к каталогу Windows. Этот каталог содержит файлы приложений Windows, файлы инициализации.ini и файлы справок.hlp. В этом каталоге вы можете хранить файлы инициализации и файлы справок своего приложения. Если приложение создает другие файлы, которые вы хотите хранить, не допуская к ним других пользователей, то помещайте их в каталог, указанный в переменной окружения HOMEPATH. При соответствующей установке этот каталог различен для всех пользователей.
Параметр Buffer является указателем на строку с нулевым символом в конце, в которую передается найденный путь. Этот путь записывается без заключительного обратного слэша "\", если только каталог Windows не является корневым.
Параметр Size указывает максимальный размер буфера в символах. Его величина должна быть не менее значения MAX_PATH.
При успешном выполнении функция копирует путь в Buffer и возвращает число символов в строке, не считая последненго нулевого. Если длина строки больше, чем Size,то возвращенное значение позволяет узнать требуемый размер буфера.
Если функция не смогла успешно завершиться, то она возвращает нулевое значение. В этом случае узнать причину отказа можно, вызвав GetLastError.
Если ваш каталог Windows назван WIN95 и расположен на диске C, то операторы
var APchar:array[0..254] of char;
...
GetWindowsDirectory(APchar,255);
занесут APchar в путь: C:\WIN95. Если Windows установлен непосредственно в корневом каталоге, то результатом выполнения функции будет C:\.
Следующие операторы создают объект Ini типа TIniFile и связывают его с файлом My.ini:
var Ini:TIniFile;
...
Ini:=TIniFile.Create('MY.INI');
Следующий оператор проверяет наличие в файле раздела My Section, содержащего ключ MyKey:
if Ini.ValueExists('My Section','MyKey') then...
Следующий оператор заносит в ключ MyKey раздела My Section значение '5':
Ini.WriteInteger('My Section','MyKey',5);
Следующий оператор удаляет ключ MyKey раздела My Section:
Ini.DeleteKey('My Section','MyKey');
Следующие операторы сохраняют содержимое объекта Ini в файле на диске и разрушают объект Ini:
Ini.UpdateFile;
Ini.Free;
Задания на разработку
1. Создайте приложение, которое позволяет вводить и добавлять в текстовый файл информацию о пользователе, запустившем данное приложение.
2. Создайте приложение, которое работает с типизированным файлом (записывает и считывает данные числового одномерного массива).
3. Создайте приложение, которое работает с нетипизированным файлом (создает копии файлов).
4. Создайте приложение, которое сохраняет накстройки в Ini-файл(положение и размеры окна) и использует их при следующих загрузках приложения.
Контрольные вопросы
1. Что такое файл? Для чего используется файловая переменная?
2. Каковы основные правила работы с файлами?
3. В чем отличие текстовых от типизированных файлов?
4. Для чего используются файлы известных вам типов?
5. Какой из известных вам типов файлов позволяет работать с файлом в режиме чтения-записи?
6. Как задать ini-файл? В чем состоит удобство работы с такими файлами?