Лазарус как сделать программу

Добавил пользователь Cypher
Обновлено: 19.09.2024

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Lazarus - кросс-платформенный Delphi
Программирование для свободных людей

© 2006 Рудюк С.А.
Компания НеРуСофт

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

Файлы – это набор информации, находящейся на дисковых носителях или в памяти.

Файлы бывают различных типов и могут иметь различные форматы. У каждого файла есть название, а длина определяется объёмом информации, помещенным в него. Объём файла может ограничиваться дисковым накопителем или системными возможностями (так, например, Windows Me/98/95 не может создавать файлы больше 2 Гб, в Windows NT/XP в NTFS файлы можно создавать размером до 16 Гб).

  1. TextFile – текстовый файл. Представляет собой набор символьных строк определённой длины. [7]
  2. File of - типизированный файл. Представляет собой набор данных указанного типа.
  3. File – нетипизированный файл. Представляет собой набор неструктурированных данных.

var
log_file : textfile ; // Текстовый файл
pokazanija : file of integer ; // Типизированный файл с целочисленными значениями
blob_file : file ; // Не типизованный файл

Основные команды работы с файлами

Для использования файловой переменной необходимо её связать с файлом:

Существующий файл можно открыть с помощью процедуры:

Если файла с заданным названием нет, тогда выдастся ошибка.

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

Если файл существует, тогда он удаляется, а на его месте записываются новые данные.

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

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

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

Данная процедура не разрывает связь, поэтому можно его открыть повторно без вызова Assign.

Для того, чтоб проверить существует файл или нет, используется процедура:

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

Текстовые файлы читаются и могут модифицироваться любым редактором.

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

read(f, data); - читает строку из файла f в переменную data.

readln(f, data); - читает строку из файла f в переменную data и после этого переходит к следующей строке.

Процедура write и writeln осуществляют вывод в текстовый файл.

write(f, data); - данные из data записываются в текстовый файл.

writeln(f, data); - данные из data записываются в текстовый файл и производит переход на следующую строку.

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

function Eof [ ( var F : FileText ) ]: Boolean ;
// Функция возвращает true, если достигнут конец файла.

function SeekEof [ ( var F : FileText ) ]: Boolean ;
// Аналогична Eof, но пробелы, табуляция и маркеры конца строки пропускаются.

function SeekEoln [ ( var F : FileText ) ]: Boolean ;
// Аналогична Eoln, но пробелы, табуляция и маркеры конца строки пропускаются.

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

Листинг программы (на компакте см. каталог: TextFile):

program consple_laz ;
// Программа читает текст с клавиатуры и записывает его в файл.
// При повторной загрузке приложения загружается ранее введённый текст.


Uses SysUtils ;
var f : TextFile ; // Текстовая переменная
data : string ; // Переменная с нашими данными
begin
AssignFile ( f , 'data.txt' ); // Связываем переменную с файлом
// Если файл существует, тогда показываем ранее введённую информацию
if FileExists ( 'data.txt' ) then
begin
Reset ( f ); // Открываем файл для ввода/вывода информации
while not Eof ( f ) do
begin
readln ( f , data ); // Читаем строку из файла
writeln ( data ); // Выводим строку на экран
end ;
CloseFile ( f ); // Закрываем файл
Append ( f ); // Открываем файл для добавления информации
end
else rewrite ( f ); // Так как файл не существует, создаем его
Writeln ;
// Вводим текст и сохраняем его в файле
Writeln ( 'Enter the text.' ); // Выводим приглашение
readln ( data ); // Читаем данные из клавиатуры
writeln ( f , data ); // Сохраняем введённую информацию в файл
CloseFile ( f ); // Закрываем файл
read ; // Ожидаем нажатия клавиши
end .

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

Типизированные файлы предназначенные для хранения информации одинакового типа.

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

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

procedure Seek ( var F ; N : Longint );
// Перемещает указатель на элемент с номером N
function FilePos ( var F ): Longint ;
// Возвращает номер текущего элемента.
function FileSize ( var F ): Integer ;
// Возвращает количество элементов в файле

Пример: Сгенерируем 100 цифр и запишем их в файл. Потом извлечём из файла каждый 10-й элемент.

Листинг программы (на компакте см. каталог: Typycal_File):

program consple_laz ;
// Программа читает текст с клавиатуры и записывает его в файл.
// При повторной загрузке приложения загружается ранее введённый текст.


Uses SysUtils ;
Const KolElems = 100 ; // Количество элементов в массиве
CountCol = 10 ; // Количество столбцов
SpaceSimb = 7 ; // Расстояние между символами
var f : File of integer ; // Текстовая переменная
data : array of integer ; // Массив с нашими данными
i : integer ; // Переменная для счётчика
data_int : integer ; // Целое число, которое получаем из файла
begin
SetLength ( data , KolElems ); // Устанавливаем размер массива в 100
Randomize ; // Устанавливаем генерацию случайных чисел
WriteLn ( 'Generate Values:' );
// Генерируем случайные значения
for i := low ( data ) to high ( data ) do
begin
data [ i ]:= Round ( Random ( 1000 )); // Устанавливаем случайное число
// Выводим элемены на экран (по 5 штук в строке)
write ( data [ i ]: SpaceSimb );
// На каждой 5-й строке переходим на следующую строку
// Прибавляем 1, т.к. первый элемент - нулевой
if (( i + 1 ) mod CountCol = 0 ) then
writeln ;
end ;
AssignFile ( f , 'data.txt' ); // Связываем переменную с файлом
rewrite ( f ); // Переписываем файл
// Сохраняем информацию в файле
for i := low ( data ) to high ( data ) do
begin
Write ( f , data [ i ]);
end ;
CloseFile ( f ); // Закрываем файл
Reset ( f ); // Открываем файл для ввода/вывода информации
WriteLn ;
WriteLn ( 'Execute Values:' );
// Читаем и выводи каждый десятый элемент
for i := 1 to ( high ( data ) div 10 ) do
begin
Seek ( f , i * 10 - 1 ); // Передвигаемся на 10 позиций, но учитываем, что вначале
// находились на первой позиции
Read ( f , data_int );
WriteLn ( Format ( 'Position %d=%d' ,[ i * 10 , data_int ]));
end ;
CloseFile ( f ); // Закрываем файл
read ( data [ 1 ]); // Ожидаем нажатия клавиши
end .

Результат выполнения программы:

Generate Values:
954 371 631 178 618 84 965 490 390 362
930 862 860 154 964 427 621 716 161 807
175 283 874 516 610 9 606 673 120 49
213 477 357 984 451 229 856 409 941 224
953 946 262 486 716 922 897 894 995 655
519 858 364 284 298 4 134 46 110 536
263 166 432 103 932 705 647 942 35 304
686 644 319 794 331 631 891 464 440 103
243 435 93 11 767 359 168 971 832 479
854 430 898 759 593 691 168 211 799 380
Execute Values:
Position 10=362
Position 20=807
Position 30=49
Position 40=224
Position 50=655
Position 60=536
Position 70=304
Position 80=103
Position 90=479

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

Нетипизированный файл – это последовательность байтов, без определённой структуры, записанная в файл.

В отличие от других типов файлов в процедурах открытия и записи добавляется ещё один параметр – размер записи. Если этот параметр не будет указан, он принимается равным 128 байтам.

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

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

Максимальный размер записи – до 2 Гб. Наиболее оптимальный размер записи с точки зрения скорости – это физический размер сектора на накопительном устройстве. Чаще всего, он составляет 512 байт. Следует отметить, что скорость с работы непизированными файлами значительно выше, чем с другими типами файлов.

Вместо процедур read и write для нетипизированных файлов используются BlockRead и BlockWrite:

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 – переменная для сохранения/чтения данных в/из файла. Размер данной переменной должен быть: Count*RecSize байтов;

Count – указывает какое количество записей необходимо записать/прочитать за одно обращение к файлу;

AmtTransferred – содержит реальное количество прочитанных/записанных файлов.

Пример: Реализуем копирование файла программы с наименованием consple_laz.exe на диск C:.

Листинг программы (на компакте проект Вы можете найти в каталоге Notypycal_File):

Результат выполнения программы:

FileSize=512276 bytes
Copy 50000 bytes
Copy 100000 bytes
Copy 150000 bytes
Copy 200000 bytes
Copy 250000 bytes
Copy 300000 bytes
Copy 350000 bytes
Copy 400000 bytes
Copy 450000 bytes
Copy 500000 bytes
--- The End ---

Некоторые процедуры для работы с файлами

Рассмотрим некоторые процедуры и функции для работы с файлами, которые могут понадобиться в будущем [7].

procedure ChDir ( S : String );
// Изменяет текущую папку на папку, указанную в символьной строке S

function DeleteFile ( const FileName : String ): Boolean ;
// Удаляет файл с заданным названием

procedure GetDir ( D : Byte ; var S : String );
// Возвращает текущую директорию

procedure MkDir ( S : String );
// Создание каталога с названием S.

procedure Rename ( var F ; NewName : String );
// Переименовывает файл, связанный с переменной F. Новое название - NewName

procedure RmDir ( S : String );
// Удаляет каталог. Удаление будет успешным, если папка пустая.

© 2006 Рудюк С.А., Компания НеРуСофт
Специально для Delphi Plus

Читайте также: