
- •1. Создание консольного приложения в среде Delphi
- •Var х,у,z:real;
- •Save changes to Unitl.Pas? (Сохранить изменения в Unitl.Pas?),
- •1. Из таблицы 3.1 взять условие задачи (вариант согласовать с преподавателем). Таблица 3.1
- •Var a1 :textfile; // a1 – текстовый файл
- •При открытии файла желательно использовать функцию
- •InitialDir типа String – определяет каталог, содержимое которого отображается при вызове окна диалога. Если каталог не задан, то отображается содержимое текущего каталога;
- •С войства компонентов
- •Контрольные вопросы
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.
Пример. Составить программу, которая:
Вводит с клавиатуры элементы целочисленной матрицы A(3x3) и записывает их в типизированный файл fl.dat.
Выводит на экран третью строку матрицы А из файла 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: