home   map   mail  
 
:: О нас :: Координаты :: Прайс-лист :: Форум :: Статьи :: Наши клиенты ::  
  rs    
 

E-Mail: support@nerusoft.com
Телефоны:
      +380 67 901-63-22
      +380 63 108-17-00
ICQ: 131-674-371
Skype: rudjuk

 
   
OTPCapital   OTPCapital - Компания
управления активами
OTP-Банк   OTP-Банк - крупнейший
банк Украины
Бухгалтерское обслуживание Факториал Консалт   Бухгалтерское,
аудиторское и
юридическое
обслуживание от
Факториал-Консалт
lightnight   Информационно-
развлекательный сайт
LightNight.
Компания РМед   Компания по продаже
медицинского
оборудования РМед.
Casa-De-Confraria   Casa-De-Confraria -
вилла в Португалии.
Н.Транс   Компания по продаже
косметики Н.Транс
Клуб SportLife   Спортивный клуб
SportLife
  Сайт
“Пригласи
Деда Мороза"
  Американская
компания
“CharlieMotors”
  Национальный
Цирк Украины
Все проекты   Все проекты >>>
 
Внимание!
Это старый наш сайт. Новый сайт находится по адресу: http://corp2.net
 
 

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

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

 

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

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

В Паскале существует 3 типа файлов:

TextFile – текстовый файл. Представляет собой набор символьных строк определённой длины. [7]

File of <тип> - типизированный файл. Представляет собой набор данных указанного типа.

File – нетипизированный файл. Представляет собой набор неструктурированных данных.

Например:

var

log_file: textfile; // Текстовый файл

pokazanija: file of integer; // Типизированный файл с целочисленными значениями

blob_file: file; // Не типизованный файл


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


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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

FileExists(<название файла>);


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


Текстовый файл представляет собой последовательность строк. В конце каждой строки расположен символ завершения строки EOLN (символ #13) , за которым может идти символ перевода строки LF (#10). Заканчивается текстовый файл символом окончания файла EOF (#26).

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


Для ввода данных из любого текстового файла можно воспользоваться известными нами функциями 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 Eof [ (var F: FileText) ]:Boolean;

// Функция возвращает true, если достигнут конец файла.


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

// Аналогична Eof, но пробелы, табуляция и маркеры конца строки пропускаются.


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

// Аналогична Eoln, но пробелы, табуляция и маркеры конца строки пропускаются.


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


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

program consple_laz;

// Программа читает текст с клавиатуры и записывает его в файл.

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


{$mode objfpc}{$H+}

{$AppType CONSOLE}


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.


Выполнение программы:


Это первый текстовый файл.

Тестируем добавление втой строки.

А

Это четвёртая строка.


Enter the text.

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


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

Ввод/вывод информации в них осуществляется с помощью процедур 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;

// Программа читает текст с клавиатуры и записывает его в файл.

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


{$mode objfpc}{$H+}

{$AppType CONSOLE}


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):


program consple_laz;

// Программа копирует файл consple_laz_copy.exe на диск C:.


{$mode objfpc}{$H+}

{$AppType CONSOLE}


Uses SysUtils;


Const FileNameApp='consple_laz_copy.exe'; // Название файла, который мы будем копировать


var f1, f2: File; // Переменные для файлов

i: integer;

buf: byte;

amttransferred: integer;

begin


// Подключаемся к файлу

AssignFile(f1, FileNameApp);

// Подключаемся к такому же файлу на диске C:

AssignFile(f2, 'C:'+FileNameApp);

// Если копируемый файл не найден, тогда выдаём сообщение и выходим

if not FileExists(FileNameApp) then

begin

Write(Format('File %s not Found',[FileNameApp]));

end

else

begin

Reset(f1, 1); // Открываем файл с размером записи 1 байт

Rewrite(f2, 1); // Создаём файл на диске C: з размером 1 байт

WriteLn(Format('FileSize=%d byte',[FileSize(f1)]));

// Само копирование файла

for i:=1 to FileSize(f1) do

begin

BlockRead(f1,buf,1); // Читаем из файла

BlockWrite(f2,buf,1); // Записываем в файл

// Показываем, когда скопирован каждый 50000 байт

if i mod 50000 = 0

then writeln(Format('Copy %d bytes',[i]));

end;

Write('--- The End ---');

CloseFile(f1); // Закрываем файл-источник

CloseFile(f2); // Закрываем файл-получатель

end;


readln; // Ожидаем нажатия клавиши


end.


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


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 Рудюк С.А. http://nerusoft.com
 

 

 

 Предложения


 Акции и объявления

Для партнёров скидки
-10%


 На правах рекламы


 
:: О нас :: Координаты :: Прайс-лист :: Форум :: Статьи :: Наши клиенты ::
Яндекс цитирования
© Copyright 1997-2008 RS™