Практическая работа 10(18)



Практическая работа №10

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

Теория

Копирование файлов

Для этого нам потребуется вызов всего одной функции, которая выполняет именно копирование файлов. Это функция CopyFile(). У нее три параметра, два из которых обязательны. Вот полный синтаксис.

CopyFile(«путь до начального файла»,»Путь  куда надо копировать»,Перезаписывать или нет)

Пример:  CopyFile(«D:sekretBD.txt»,»C: ame.txt», true);

В первом параметре можно указывать не только полный путь до файла. Если укажем, например, такой путь «sekretBD.txt», то наша программа будет искать этот файл в своем каталоге. Имя и разрешение нужно указывать именно такими, какие они есть у файла, иначе программа просто не найдет файл.

Во втором параметре тоже можно указывать относительный путь и там вы можете указать имя и расширение файла такое, какое захотите. Т.е. с помощью этой функции можно делать и переименовывание тоже.

Третий параметр отвечает за перезапись файла. Если мы укажем true, то файл не будет перезаписан, а если false, то программа перезапишет файл.

Переименование файлов

За переименование файлов отвечает функция RenameFile(). У нее 2 параметра. Вот ее полный синтаксис

RenameFile(«путь до файла»,»новое имя»);

Честно говоря, синтаксис этой функции меня не особо радует. В нем тоже в обоих параметрах надо указывать полный путь. Т.е. если мы, например, напишем так

RenameFile(«C:2.txt»,»3.txt»);

То он скопирует файл в каталог программы. Т.е. получается, что она может выполнять роль копирования тоже. Это немного странно.

Удаление файлов

Ну здесь все совсем просто. Функция, с помощью которой можно удалить файл, вызывается так:

DeleteFile(«C:myprofile.txt»);

Единственное, что она не всегда 100% удаляет файл. Когда файл защищен, она его не сможет удалить.

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

Технология работы с файлами в системе Delphi требует определённого порядка действий:

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

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

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

Файловая переменная вводится для указания на файл. Делается это с помощью ключевого слова File:

   var F:  File ;

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

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

   var F:  File of тип_записи ;

В качестве типа могут использоваться базовае типы, или создаваться свои.

Файл, компонентами которого являются данные символьного типа, называется символьным, или текстовым:

 var F: TextFile;

Данные, считанные из файла или записываемые в файл, содержатся в обычной переменной, которая должна быть того же типа, что и файловая.

Для файла существует понятие текущей позиции. Она показывает номер элемента, который будет прочитан или записан при очередном обращении к файлу. Чтение-запись каждого элемента продвигает текущую позицию на единицу вперед. Для большинства файлов можно менять текущую позицию чтения-записи, выполняя прямой доступ к его элементам.

Для работы с файлами всех трёх типов существуют общие правила:

1. Файл является некоторой переменной, следовательно, ему следует присвоить имя. С другой стороны, операционная система использует имена файлов на различных носителях. Между именами файлов в Delphi и именами файлов, присеваемых операционной системой, нужно установить связь. Для этого имеется стандартная процедура Assign, вызов которой осуществляется следующим образом:

Assign (<имя>, <файл>);

2. Файл f следует открыть для выполнения планируемых операций с помощью одной из трёх процедур: Reset(f), Rewrite(f) или Append(f), входящих в стандартный модуль System. Существуюший файл открывается для считывания с помощью процедуры Reset, а для создания нового файла и подготовки его к записи применяется процедура Rewrite. Типизированные нетекстовые файлы всегда открываются с помощью процедур Rewrite и Reset, причём последняя делает файл доступным не только для считывания, но и для записи или дозаписи. Для дозаписывания текстового файла необходимо его открыть с использованием процедуры Append(f). С помощью процедуры Rewrite открывается новый пустой файл, и ему приписывается имя, заданное процедурой Assign. Если файл с таким именем уже существует, то он уничтожается.

3. С помощью стандартных процедур Read(f, <список ввода>), Readln(f, <список ввода>) или Write(f, <список вывода>), Writeln(f, <список вывода>) можно соответственно считать данные из файла f или записать данные в файл. В этих операторах f — это файловая переменная; <список ввода-вывода> — это перечисленные через запятую имена переменных при вводе и перечисленные через запятую выражения, значения которых выводятся при выводе. Процедуры Readln, Writeln предназначены для работы со строками и могут использоваться без указания списка ввода-вывода. Типизированные файлы строятся из записей фиксированного размера, который задаётся неявным образом при объявлении типа файла. Поэтому такие файлы, открытые процедурой Reset, могут быть модифицированы путём попеременного обращения к процедурам Read и Write.

4.После завершения работы с файлом с помощью стандартной процедуры CloseFile(f) файл закрывается. При этом дописывается метка конца файла EOF. Закрытие файла с помощью процедуры CloseFile позволяет обеспечить сохранность информации. При попытке закрыть с помощью CloseFile файл, который не был до этого открыт или который уже закрыт, возникает ошибочная ситуация.

Текстовые файлы

После связывания файловой переменной с именем файла, в зависимости от поставленных задач можно пойти по одному из трёх путей:

1. Создание нового текстового файла.

2. Открытие существующего файла в режиме только для чтения.

3. Открытие существующего файла с возможностью добавления новых строк.

Для реализации этих задач предусмотрено три процедуры:

procedure Rewrite (var f: File [; RecSize]);

Ключевой параметр процедуры — файловая переменная F. В результате выполнения метода формируется пустой файл с именем, определённым в процедуре инициализации AssignFile(). Если вдруг имя вновь создаваемого файла совпадёт с именем существующего, то старый файл стирается без всякого предупреждения. Второй необязательный параметр определяет, какими порциями будут осуществляться операции записи данных в файл. По умолчанию назначается размер, равный 128 байт. При работе с текстовыми файлами этот параметр не используется.

Для открытия уже существующего файла процедура Rewrite() не нужна. Вместо неё используется метод инициализации чтения:

procedure Reset (var F [: File; RecSize: Word]);

Параметры процедуры идентичны аргументам предыдущего метода. После открытия внутренний указатель файла позиционируется на самом первом его байте. При использовании метода Reset() надо иметь в виду, что режим открытия файла этой процедурой зависит от значения глобальной переменной FileMod. По умолчанию в ней содержится значение 2, что соответствует режиму, допускающему как чтение, так и запись. Если планируется работа с файлом только в режиме чтения, то перед вызовом Reset() присвойте переменной FileMod значение 0. Соответственно, если файл открывается только для записи, установите переменную в значение 1.

При работе с текстовыми файлами метод Reset() откроет файл в режиме только для чтения независимо от значения переменной FileMod.

Текстовый файл может открываться в режиме добавления данных в конец файла. Для этого вызывается процедура:

procedure Append (var F: Text);

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

Функция Eof — проверяет находится ли внутренний указатель файла на самой последней его строке. Этот метод обычно применяется при организации чтения данных из файла:

function Eof [ (var F: Text) ]: Boolean;

Метод SeekEof — отличается от обычного Eof тем, что умеет распознавать пустые строки (заполненные символами пробела) и исключать их из процесса чтения:

function SeekEof [ (var F: Text) ]: Boolean;

Функции Eoln и SeekEoln — проверка на нахождение указателя в конце строки текстового файла и соответственно аналогичный метод, но игнорирующий пробелы:

function Eoln [ (var F: Text) ]: Boolean;

function SeekEoln [ (var F: Text) ]: Boolean;

Пример программы, создающей новый файл в корне диска C:\ и заполняющей его десятью символами А:

var F: TextFile;

     i: integer;

AssignFile(F, ‘C:\NewFile.txt’);

Rewrite(F);

for i:=0 to 9 do Write(F, ‘A’);

CloseFile(F);

Пример программы, осуществляющей вывод содержимого текстового файла с последующим отображением прочитанной информации на экран компьютера:

var F: TextFile;

     s: string;

AssignFile(F, ‘C:\NewFile.txt’);

Reset(F);

while SeekEof(f)=False do

begin

Readln(F, S);

Writeln(s);

end;

CloseFile(F);

Пример программы, добавляющий десять строк в конец текстового файла:

var F: TextFile;

     i: integer;

AssignFile(F, ‘C:\NewFile.txt’);

Append(F);

for i:=0 to 9 do WriteLn(F, ‘Строка -‘, i);

CloseFile(F);

Типизированные файлы

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

Типизированные файлы используют ряд процедур и функций характерных только для них. Процедура Seek отвечает за позиционирование внутреннего указателя файла:

procedure Seek (var F; N: Longint);

Первый аргумент данного метода требует передачи файловой переменной. Второй параметр определяет, в каком месте файла мы собираемся отказаться. Чтобы поместить указатель в начале файла надо набрать Seek(F, 0); в конец файла — Seek(F, FileSize(F)-1); в середину файла — Seek(F, FileSize(F) div 2.

Чтобы узнать в каком месте находится указатель в настоящий момент существует метод:

function FilePos (var F): Longint;

Если указатель ссылается на начало файла, то функция вернёт нулевое значение, а если на конец, то возвратит значение FileSize(). Следующий метод сообщает о количестве записей в типизированном файле:

function FileSize (var F): integer;

Эта функция возвращает размер файла не в байтах, а в элементах, из которых состоит файл. Поэтому, чтобы выяснить физический размер типизированного файла в байтах, необходимо необходимо умножить значение FileSize(F) (возвращающее количество записей в файле) на размер этой записи в байтах — SizeOf( ).

Процедура переименования файла:

procedure Rename (var F; NewName: string);

Процедура удаления файла:

procedure Erase (var F);

Прежде чем удалить файл, определённый в файловой переменной F, обязательно закройте его, вызвав метод CloseFile( ).

Пример программы реализующей применение типизированного файла:

type TPeople = packed record

       SurName: string[25];

       FName, LName: Char;

       Money: currency;

      end;  

   

var People: TPeople;

     F: File of TPeople;

AssignFile(F, ‘C:\NewFile.dat’);

Rewrite(F);

with People do // Заполнение полей записи

begin

SurName:=’Иванов’;

People.FName:=’B’;

People.LName:=’A’;

People.Money:=1000;

end;

Write(F, People); // Внесение записи

CloseFile(F);

Важное преимущество типизированного файла — возможность редактировать любой из элементов файла. В обычном текстовом файле можно лишь добавлять строки. Следующий пример демонстрирует как это реализовать:

type TPeople = packed record

       SurName: string[25];

       FName, LName: Char;

       Money: currency;

      end;  

   

var People: TPeople;

     F: File of TPeople;

AssignFile(F, ‘C:\NewFile.dat’);

Reset(F);

with People do // Заполнение полей записи

begin

SurName:=’Петров’;

People.FName:=’Г’;

People.LName:=’Л’;

People.Money:=800;

end;

Seek(F, 0);

Write(F, People); // Внесение изменение в запись записи

CloseFile(F);

Программа демонстрирует случай если понадобится удвоить оклады всем сотрудникам:

type TPeople = packed record

       SurName: string[25];

       FName, LName: Char;

       Money: currency;

      end;  

   

var People: TPeople;

     F: File of TPeople;

AssignFile(F, ‘C:\NewFile.dat’);

Reset(F);

while FilePos(F)<>FileSize(F) do

begin

Read(F, People);

People.Money:=People.Money*2;

seek(F, FilePos(F)-1);

Write(F, People);

end;

CloseFile(F);

Пример удаления из типизированного файла ненужного элемента путем копирования файла во временный файл:

type TPeople = packed record

       SurName: string[25];

       FName, LName: Char;

       Money: currency;

      end;  

   

var People: TPeople;

     Source, Receptor: File of TPeople;

AssignFile(Source, ‘C:\People.dat’);

Rename(Source, ‘c:\~People.dat’); // Переименовываем старый файл

Reset(Source);

AssignFile(Receptor, ‘c:\People.dat’);

Rewrite(Receptor);

while FilePos(Source)<>FileSize(Source) do

begin

Read(Source, People);

if People.SurName<>‘Петров’ then Write(Receptor, People);

end;

CloseFile(Source);



Страницы: 1 | 2 | Весь текст




map