If Ini.ValueExists('My Section','MyKey') then

Кафедра общей физики

ИНФОРМАТИКА

Часть 2

Основы программирования на языке PASCAL

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

Работа с файлами

Волгоград

Составитель: Глазов С.Ю., доцент кафедры общей физики ВГПУ

Информатика. ч.2. Основы программирования на языке Pascal. Лабораторная работа №12

Работа с файлами

2007.

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

Основы программирования на языке PASCAL

Работа с файлами.

Цель работы:изучить основные принципы работы с файлами и каталогами в Object Pascal; научиться использовать Ini – файлы для сохранения настроек программ.

Различают файлы трех видов: текстовыефайлы, типизированные файлы и нетипизированные файлы.

Алгоритм работы с файлами:

  1. Открыть файл.

a. Связать файловую переменную с конкретным файлом на диске.

b. Указать для файла направление передачи данных (инициировать файл).

  1. Читать или записывать данные файла.
  2. Закрыть файл.

Файлы становятся доступны программе только после выполнения процедуры

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-файл? В чем состоит удобство работы с такими файлами?

Наши рекомендации