Лабораторные работы №15
Тема: Работа с нетипизированными файлами.
Цель: Развить навыки обработки нетипизированных файлов.
Оборудование и материалы: Методическое пособие, ПЭВМ, ручка, карандаш, линейка, ластик, шаблон А4.
Ход работы
Методические рекомендации.
Прежде чем приступить к выполнению индивидуальных заданий, ознакомьтесь с типами файлов, процедурами управления файловыми данными. Обратите внимание на общие процедуры для всех типов файлов, а так же на процедуры характерные только для одного типа.
Решение задач представить в следующем порядке: постановка задачи, построение математической модели, программный код, тестирование.
Задание для лабораторной работы выбрать согласно варианту по приведённой таблице. Вариант определяется порядковым номером в журнале группы.
Общие сведения.
Нетипизированными называют файлы, объявленные без указания типа его компонентов. Операции чтения и записи с такими файлами осуществляются блоками. Отсутствие типа компонента делает эти файлы совместимыми с любыми другими, а выполнение ввода/вывода блоками позволяет организовать высокоскоростной обмен данными между диском и памятью. Нетипизированные файлы, как и типизированные, допускают организацию прямого доступа.
|
|
Нетипизированный файл можно открыть для записи и чтения, используя процедуры ReWrite и ReSet, При открытии нетипизированного файла этими процедурами вторым параметром recsize можно указать длину записи файла в байтах. Если длина записи не указана, она принимается равной 128 байтам:
ReWrite(Var f; [recsize:word])
ReSet (Var f; [recsize:word]).
Длина записи recsize - положительное число, не превышающее 65535 байт. Для обеспечения максимальной скорости обмена данными следует задавать длину, которая была бы кратна размеру сектора диска (512 байт), например: 1024,2048.
При работе с нетипизированными файлами можно использовать все процедуры и функции, предназначенные для работы с типизированными файлами, за исключением процедур Read и Write, Эти процедуры заменяются высокоскоростными процедурами BlockRead и BlockWrite.
1. Процедура BlockRead(Var f:file;Var buf; Count:word [;res:word) - осуществляет чтение блока записей из файла в буфер.
Параметр buf определяет буфер, который будет участвовать в обмене данными. Размер буфера должен быть достаточен для размещения Count записей указанной в процедуре ReSet длины.
Параметр res будет содержать количество фактически обработанных записей. Если последная запись - неполная, т.е. ее длина меньше указанной длины записи, то значение параметра res ее не будет ее включать.
2. Процедура BlockWrite(Var f:file; Var buf; Count:word [;res:word) - осуществляет запись блока из буфера buf в файл.
|
|
Пример 1. Разработать программу копирования файлов. При создании данной программы нам безразлично, что именно хранится в файле, поэтому используем нетипизированные файлы. При этом длину записи установим равной 1, буфер предусмотрим на 2048 байт. Так мы гарантируем отсутствие неполных записей и в то же время за одну операцию будем обрабатывать блок большого размера.
Program copir;
Const recs=1024; {размер записи}
Var fi, fo: file; { нетипизированные файлы}
buf: array [1..2*recs] of byte; {буфер на 2048 байт} i: word;
namein,nameoutl: string;
Begin
WriteLn( 'Введите имя файла - источника: ' );
Readln ( namein );
{проверка наличия файла с указанным именем}
Assign ( fi, namein );
{$I-}
ReSet( fi,1 ); (открываем файл для чтения}
{$I+}
If lOResult <> 0 then begin
WriieLn(#7, ' Не существует факш с именем ‘,namein);
Halt
end;
WriteLnf 'Введите имя файла - приемника '); ReadLn (nameout);
Assign(fo,nameout);
ReWrite(fo,1); {открываем файл для записи} while not EOFtfi) do
Begin
BlockRead(fi,buf,siz.eof(buf),i); {читаем блок из входного файла} BlockWrite(fo,buf,i); {пишем блок из буфера в выходной файл} end;
Close(fi);
Close(fo)
End.
Процедуры и функции библиотеки DOS для работы с файлами.
Borland Paskal предоставляет программисту возможность обращения к некоторым функциям MS DOS, обеспечивающим функционирование файловой системы. Для этого необходимо в начале программы подключить библиотеку DOS с помощью директивы Uses Dos, чтобы сделать доступными ее ресурсы, описанные в этом разделе.
Для работы с файлами библиотека Dos содержит следующие процедуры и функции.
1. Функция DiskFree(drive:byte):LongInt - определяет и возвращает объем свободного места на диске drive в байтах. Параметр drive можетпринимать значения:0- устройство по умолчанию, 1- диск А, 2- диск В и т. д.
2. Функция DiskSize(drive:byte):LongInt - возвращает полный объем указанного диска в байтах. Параметр drive принимает те же значения, как и в предыдущей функции.
3. Процедура GetFTime(Var f; Var Time: LongInt) - возвращает время создания или последнего обновления указанного файла f. Время возвращается в упакованном формате, который необходимо распаковать.
4. Проседура UnPackTime (time: LongInt; Var DT:DateTime) - распаковывает значение параметра time, который содержит время в упакованном формате, в специальный тип DateTime, описанный в модуле Dos следующим образом:
Type DateTime=record
Year: word; {год}
Month: word; {месяц:1..12}
Day: word; {число:1...31}
Hair: word; {часы:0..23}
Min: word; {минуты:0..59}
Sec: word; {секунды:0…59}
End;
5. Процедура PackTime(DT:DateTime; Var time: LongInt) - позволяет упаковать параметр DT типа DateTime в целое число time.
6. Процедура SetF Time(Var f; time: LongInt) - используется для установки даты создания или обновления файла; time+ время и дата в упакованном формате.
7. Процедура GetFAttr(Var f; Var Attr: word) - применяется для получения атрибутов файла, указанного файловой переменной. Атрибуты файла («только чтение», «скрытый», «системный» и т. д.) кодируются битами байта атрибутов файла. Комбинация битов в байте может указывать самые рпзные варианты. Байт атрибутов возвращается в младшем байте параметра Attr.
Для расшифровки байта атрибутов в модуле Dos описаны специальные маски длиной 1байт:
Const Readonly = S01; {только чтение}
Hidden = $02; {скрытый файл}
Sysfile = $04; {системный файл}
VolumelD = $08; {идентификатор тома}
Directory = $10; {имя подкаталога}
Archive = S20; {архивный файл}
Anyftle = S3F; {любой файл}
Для того чтобы определить, установлен или нет соответствующий бит, используют
фрагменты, аналогичные следующему:
GetFAttrffAttrF);
if Lo(AttrF) && Readonly <>0 then
WriteLn('Файл имеет атрибут "только чтение"')
8. Процедура SetFAttr(Var f; Attr:word) - служит для установки атрибутов файла указанного файловой переменной.
9. Функция FSearch(path:PathStr; DirLisl:string):PathStr – возвращает путь к файлу, заданному в строке path, который ищется в указанном списке каталогов; имена каталогов в списке должны быть разделены точкой с запятой «;». Если файл не найден, то возвращается пустая строка.
10. Процедура FSplit(path:PathStr; Var Dir:DirStr; Var name:NameStr;Var Ext:ExtStr) - осуществляет расщепления имени файла, заданного в path, т. е. возвращает в качестве отдельных строк путь к файлу dir, его имя name и расширение ext. Процедура не проверяет наличие на диске указанного файла.
|
|
11. Функция FExpand(path:PathSrt):PathStr - возвращает полное имя указанного файла. Функция не проверяет наличие файла на диске, а просто дополняет имя файла недостающими параметрами.
Пример 6.7. Разработать программу, которая обращается к функциям библиотеки Dos для:
определения и изменения даты создания файла;
определения атрибутов файла;
определения количества свободного места на диске.
Program fundos; { проверка функций библиотеки dos}
Uses dos, crt;
Var fi, fo:text; {текстовые файлы}
k,i: word; titne, size: longint; date: DateTime;
pathf: DirStr; namef: NameStr; extp:ExtStr;
atr: byte; {переменные для хранения байта атрибутов файла}
name: striag;
Begin
CIrScr;
WriteLn ('Введите имя файла:');
ReadLn (name);
Assign (fi.name);
{$I-} ReSet(fi);{$I+} {проверяем наличие файла с именем пате}
if IOResult <> 0 then
begin
WriteLn(#7, ' нет файла с именем ‘name’);
Halt;
end;
GetFTime(fi, time); (определяем дату создания файла} UnPackTime(lime, date); {распаковываем дату}
WriieLn ("Дата создания файла=',date.year:5,date.month:3, date.day:3); WriteLn('Время создания файла = '.date.hour:3,date.min:3.date.sec:3);
with date do
begin year: =2001; month: =3; day:=8 end; PackTime(date, time); {упаковываем дату}
SelFTime(fi, time); {меняем дату}
WriteLn ('После изменения даты:');
WriteLn (dama создания файла = ',date.year:5,date.month:3,date.day:3);
WritiLn('время создания файла =’date.hour:3,date.min:3,date.sec:3);
FSplit(name, pathf, nameJ, extf); {расщепляем имя файла}
WriteLп {'Полпое имя файла = ',pathf:25,namef:12,extf:8);
GetFAtlr(fi,k); {определяем атрибуты файла}
atr:=lo(k);
WriieLn (‘байт атрибутов ',atr);
size: = DiskFree (1);
WriteLn (‘Свободное место на диске А ‘,size: 10,' байт ');
Close(fi);
End..
Результат работы программы:
Введите имя файла: e:\iva\primer.pas\file\primer.txt
Дата создания файла = 2001 3 7
Время создания файла = 10 47 22
После изменения даты
дата создания файла = 2001 38
время создания файла = 10 47 22
Полное имя файла = c:\iva\primer.pas\flle\ primer .txt
байт атрибутов 32
Свободное место на диске Л 9104 байт
1. Классификация файлов. В программе существует три класса файлов - типизированные, бестиповые и текстовые, - которые позволяют считывать большие объемы данных непосредственно с диска, не вводя их с клавиатуры.
|
|
Текстовыми называют файлы, состоящие из любых символов. Они организуются по строкам, каждая из которых заканчивается символом «конец строки». Конец самого файла обозначается символом «конец файла». При записи информации в текстовый файл, просмотреть который можно с помощью любого текстового редактора, все данные преобразуются в символьный тип и хранятся в этом виде.
Файлы, состоящие из компонентов одного типа, число которых заранее не определено и может быть любым, называются типизированными. Они заканчиваются символом "конец файла», хранятся в двоичном виде и не просматриваются с помощью текстовых редакторов.
В бестиповых файлах информация считывается и записывается блоками определенного размера. В них могут храниться данные любого вида и структуры.