Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб12-17 (Delphi) - выполнять в мое отсутствие.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
3.73 Mб
Скачать

Var a1 :textfile; // a1 – текстовый файл

а2 :file of integer;

a3 :file of char; // а2 и a3 – типизированные файлы

а4 :file; // а4 – нетипизированный файл

Файловую переменную перед использованием необходимо связать с внешним файлом процедурой

AssignFile(<файловая переменная>, <имя файла>);

где <файловая переменная> – имя переменной файлового типа, объявленной в программе; <имя файла> – символьная строка, содержащая имя файла. Если файл находится в одной папке с обрабатывающей его программой, то указывается только имя файла, если в другой – полный путь к файлу.

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

Reset(<файловая переменная>);

Если внешний файл с указанным именем отсутствует, то возникает ошибка периода выполнения программы. Текущая позиция в файле устанавливается на начало файла, т.е. связанная с файлом переменная-указатель будет указывать на компонент с порядковым номером 0. Если файловая переменная связана с текстовым файлом, то он будет доступен только для чтения. Для типизированных и нетипизированных файлов, открытых процедурой Reset, допускается выполнять операции чтения и записи в файл.

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

Rewrite(< файловая переменная >);

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

Если процедура Rewrite открывает текстовый файл, то он становится доступным только для записи. Для типизированных и нетипизированных файлов, открытых процедурой Rewrite, допускается выполнять операции чтения и записи в файл.

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

Append(<файловая переменная>);

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

Открытый файл закрывается с помощью процедуры

CloseFile(<файловая переменная>);

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

При открытии файла желательно использовать функцию

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

где <имя файла> – это символьная строка, содержащая имя файла на внешнем запоминающем устройстве. Если файл существует, то функция возвращает true, если нет – false.

Текстовый файл – последовательность символов, сгруппированных в строки произвольной длины, где каждая строка заканчивается символом конца строки – EOLN (символ перевода каретки CR (#13), за которым, возможно, следует символ перевода строки LF (#10)). Заканчивается файл символом конца файла EOF (end-of-file, #26).

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

rеаd(f,х,у,z); {прочитать из файла, связанного с файловой переменной f, значения переменных х,у,z}

readln(f,а); {прочитать из файла, связанного с файловой переменной f, значение в переменную а и перейти к следующей строке}.

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

Например,

write(fi,'s=',s) {осуществляет вывод в файл, связанный с файловой переменной fi, символьной строки 's=' и значение переменной s}.

Процедура writeln(fi); выводит пустую строку в файл, связанный с файловой переменной fi.

Пример.

Составить программу для нахождения суммы двух одинаковых квадратных матриц произвольного размера. Ввод исходных данных осуществить из текстового файла inp.txt. Результаты вывести в файл result.tхt.

Решение

Для создания текстового файла inp.txt, содержащего размер матриц n, а также сами матрицы а и b, можно использовать любой текстовый редактор. Используемые файлы inp.txt и result.txt размещены в одной папке с исполняемым файлом программы. Поэтому в процедурах AssignFile указаны только имена файлов без пути доступа к ним.

Программа

program pl;

{$APPTYPE CONSOLE}

uses SysUtils;

type mas=array of array of integer;

var а,b,c :mas;

gl,g2,n,i,j :integer;

fl,f2 :TextFile;

begin

AssignFile(fl,'inp.txt');

AssignFile(f2,'result.txt');

Reset(fl);

Rewrite(f2);

readln(fl,n);

SetLength(a,n,n);

SetLength(b,n,n);

SetLength(c,n,n);

gl := 0; g2 := n-1;

for i := gl to g2 do

begin

for j := gl to g2 do read(fl,a[i,j]);

readln(fl);

end;

for i := gl to g2 do

begin

for j := g1 to g2 do

read(fl,b[i,j]);

readln(fl)

end;

CloseFile(fl);

for i := gl to g2 do

for j := g1 to g2 do c[i,j] := a[i,j]+b[i,j];

writeln(f2,'Result array');

for i := g1 to g2 do

begin

for j := gl to g2 do

write(f2,c[i,j]:2);

writeln(f2)

end;

CloseFile(f2);

writeln('Program terminated');

readln

end.

При работе с текстовыми файлами положение текущей позиции в файле контролируется функциями:

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

возвращает значение true, если достигнут конец текстового файла, связанного с файловой переменной F.

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

возвращает значение true, если достигнут конец строки в текстовом файле, связанного с файловой переменной F.

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

действует аналогично Eof, но пробелы, знаки табуляции и маркеры конца строки EOLN пропускаются.

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

действует аналогично Eoln, но пробелы и знаки табуляции пропускаются.

Используя функции Eof и Eoln, можно организовать ввод массивов.

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

……………………

I:=0;

while not(eof(fa)) do

begin

j:= 0;

while not(eoln(fa)) do

begin

read(fa,a[i,j]);

j := j+1;

end;

readln(fa);

i = i+1;

end;

……………………

Если текстовый файл содержит символьное представление числовых данных, то вместо функций Eof и Eoln лучше использовать SeekEof и SeekEoln.

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

Для чтения данных из типизированного файла применяется процедура read. Для записи в типизированный файл используется процедура write. При использовании процедуры read или write, указатель файла перемещается к следующему по порядку элементу файла. Процедуры readln и writeln, используемые для текстовых файлов, для типизированных файлов не применяются.

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

procedure Seek(var F; N: Longint);

перемещает текущую позицию (указатель) в типизированном файле, связанном с файловой переменной F к требуемому компоненту с номером N. Нумерация компонентов в файле начинается с нуля.

function FilePos(var F): Longint;

возвращает номер текущего компонента в файле, связанном с файловой переменной F.

function FileSize(var F): Integer;

возвращает количество компонентов в файле, связанном с файловой переменной F.

Пример. Составить программу, которая:

  1. Вводит с клавиатуры элементы целочисленной матрицы A(3x3) и записывает их в типизированный файл fl.dat.

  2. Выводит на экран третью строку матрицы А из файла fl.dat.

Решение

Нумерация элементов двумерного массива в файле идет слева направо, сверху вниз. Учитывая то, что нумерация начинается с нуля, элемент матрицы А[2,1] будет являться шестым компонентом в файле.

Программа

program pl;

{$APPTYPE CONSOLE}

uses SysUtils;

var а :array [1..3,1..3] of integer;

f :file of integer;

i,j :integer;

begin

program pl;

{$APPTYPE CONSOLE}

uses SysUtils;

var а :array [1..3,1..3] of integer;

f :file of integer;

i,j :integer;

begin

for j := 1 to 3 do read(a[i,j]);

readln

end;

for i := 1 to 3 do

for j := 1 to 3 do write(f,a[i,j]);

seek(f,6);

writeln('Result:');

for j := 1 to 3 do

begin

read(f,a[3, j]);

write(a[3,j]:2);

end;

CloseFile(f);

readln

end.

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

В процедурах Reset и Rewrite для нетипизированных файлов указывается дополнительный параметр RecSize, чтобы задать размер записи, использующейся при передаче файла:

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

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

Длина записи RecSize измеряется в байтах и может быть задана произвольным целым числом – от 1 байта до 2 Мбайт. Если параметр не указан, то принимаемая по умолчанию длина записи равна 128 байтам.

Вместо процедур Read и Write используются процедуры, позволяющие пересылать данные с высокой скоростью:

procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);

procedure BlockWrite(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);

где F – имя файловой переменной, связанной с нетипизированным файлом, Buf – переменная, в которую помещаются данные при чтении из файла и из которой извлекаются данные при записи в файл. Переменная Buf должна иметь длину, равную Count * RecSize байт. Count – параметр целого типа, указывающий, какое количество записей необходимо прочитать или записать за одно обращение к файлу. Необязательный параметр AmtTransferred содержит количество реально прочитанных или записанных записей.

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

procedure ChDir(S: string);

изменяет текущую папку на папку, указанную в символьной строке S.

function DeleteFile(const FileName: string): Boolean;

удаляет файл, имя которого содержится в символьной строке FileName. Если удаление прошло успешно, функция возвращает true.

procedure GetDir(D: Byte; var S: string);

возвращает текущую папку в папку, определенную параметром А, на диске, определенном параметром D:

Значение параметра D

Папка

0

текущая папка

1

А

procedure MkDir(S: string);

создает новую папку, имя которой указано в символьной строке S.

procedure Rename(var F; Newname:string);

переименовывает файл, связанный с файловой переменной F. Новое имя файла задается в переменной Newname.

procedure RmDir(S: string);

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

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

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

        • OреnDiаlоg – выбор открываемого файла;

        • SaveDialog – выбор сохраняемого файла;

        • OреnРiсtureDialog – выбор открываемого графического файла;

        • SavePictureDialog – выбор сохраняемого графического файла;

        • PrintDialog – вывод на принтер;

Основные свойства компонентов OpenDialog и SaveDialog: