Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Подпрограммы, работающие со строками

Поиск

Рассмотрим лишь некоторые подпрограммы. Они имеются во всех рассматриваемых версиях Паскаля.

Функции

CONCAT(S1,S2,...,SN)- функция типа STRING; возвращает строку, представляющую собой сцепление (конкатенацию) строк-параметров S1,S2,...,SN. Конкатенацию строк можно также получить с помощью операции +.

COPY(ST,INDEX,COUNT)- функция типа STRING; копирует из строки ST COUNT символов, начиная с символа с номером INDEX.

LENGTH(ST)- функция типа INTEGER; возвращает длину строки ST.

P OS(SUBST,ST)- функция типа INTEGER; отыскивает в строке ST первое вхождение подстроки SUBST и возвращает номер позиции, с которой она начинается; если подстрока не найдена, возвращает нуль.

Процедуры

DELETE(ST,INDEX,COUNT)-удаление COUNT символов из строки ST, начиная с символа с номером INDEX.

INSERT(SUBST, ST, INDEX) - вставка подстроки SUBST в строку ST, начиная с символа с номером INDEX.

STR(X[:WIDTH[:DECIMALS]],ST) -преобразование значения типа REAL или INTEGER в строку символов ST так, как это делает процедура WRITELN перед выводом; параметры WIDTH и DECIMALS, если они присутствуют, задают формат преобразования (WIDTH - длину числа, DECIMALS - длину дробной части; параметр DECIMAL имеет смысл указывать только для вещественных чисел).

VAL(ST, X, CODE) - преобразование строки ST во внутреннее представление целого или вещественного числа Х; параметр CODE содержит нуль, если преобразование прошло успешно, в противном случае он содержит номер символа в строке ST, где обнаружен ошибочный символ; пробелы перед числом в строке ST должны отсутствовать.

Одной из практически важных задач, решаемых с помощью строковых типов, является задача обработки данных сложной структуры. Эти данные часто собраны в таблицу. Строка таблицы соотвествует некоторому объекту исследования: товару, человеку, предприятию. Строка, несмотря на то, что состоит из символов, содержит смысловые данные разного типа; например, наименование товара имеет символьный тип, его стоимость – вещественный, и т. д.

Для обработки такой строки необходимо выделить ее смысловые поля-подстроки (с помощью функции COPY), перевести некоторые поля из символьного представления в числовое (с помощью процедуры VAL). Затем, возможно, потребуется проанализировать символьные поля с помощью функции POS и подготовить строку выходных данных с помощью STR и CONCAT.

Ниже рассматривается пример такой задачи.

Пример. Сведения об игрушках представлены в виде таблицы:

N название игpушки миним. возраст максим. возраст цена (руб.)
  Конструктор "Юность-3"      
  LEGO (конструктор)      
  Кукла      
     
2 с. 29 символов 8 симв. 8 симв. 8 симв.

Последняя строка таблицы не относится к исходным данным, в ней задается ширина столбцов в символах без учета разделителей между столбцами.

Определить самый дорогой конструктор для детей в возрасте до семи лет и его стоимость.

Program Primer3_1_3;

VAR N:Integer;{число строк таблицы}

TABL:String[60];{строка таблицы–содержимое столбцов +5 разделителей}

nu:String[2]; {подстрока-номер игрушки}

name:String[29]; {подстрока-название игрушки}

MinAge,MaxAge,Rub:String[8]; {подстроки: мин. и макс. возраст,цена}

max:Real; {максимальная стоимость конструктора}

MaxAR,RubR:Real;{макс.возраст и стоимость в веществен. представлении}

namemax:String[29];{название конструктора с максимальной ценой}

i {счетчик игрушек},

C {номер ошибочного символа при преобразовании строки в число}:Integer;

BEGIN

Writeln(' Введите число наименований игpушек');

ReadLn(N);

max:=0;

Writeln('Вводите сведения об игpушках в виде таблицы');

Writeln(

'┌─┬─────────────┬─────┬─────┬────┐');

Writeln(

'|N | название игpушки | миним. | макс. | стои- |');

Writeln(

'| | | возpаст |возpаст |мость |’);

Writeln(

'├─┼─────────────┼─────┼─────┼────┤');

For i:=1 to N Do

BEGIN

Readln(TABL);

name:=Copy(TABL,5,29); {выделение подстрок названия}

MaxAge:=Copy(TABL,44,8); {и максимального возраста}

Val(MaxAge,MaxAR,C); {преобразование строка - число }

If C<>0 Then

Writeln(' ошибка в',C,'-й позиции MaxAge')

Else

Begin

If ((Pos('констpуктоp',name)>0) or {входит ли в название}

(Pos('Констpуктоp',name)>0)) and {слово "конструктор"}

(MaxAR<=7) Then

Begin

Rub:=Copy(Tabl,53,8); {выделение подстроки цены}

Val(Rub,RubR,C); {преобразование строка-число}

If C<>0 Then

Writeln(' ошибка в',C,'-й позиции Rub')

Else

Begin

If RubR>max Then {определение текущего значения}

BEGIN {максимальной цены}

max:=RubR;

namemax:=name{запомнили конмтруктор с макс. ценой}

END;

End

End

End

END;

If max=0 Then

WriteLn(' Констpуктоpов для детей до семи лет нет')

Else

BEGIN

WriteLn('Cамый доpогой констpуктоp для детей до семи лет');

STR(max:6:2,Rub);{перевод max в строку}

WriteLn(CONCAT(namemax, ' стоит ',Rub, ‘ рублей’);

END;

END.

При обработке таблиц большого объема эта программа имеет, по крайней мере, два недостатка:

1) количество строк таблицы задается вводом (но ручной подсчет количества строк таблицы – это достаточно большой труд);

2) ввод данных происходит с экрана, хотя, конечно, лучше хранить данные в файле на внешнем носителе и осуществлять ввод из файла.

Эти недостатки можно устранить, используя тип файл (см. §3.3).

Тип запись

Пока мы рассматривали одну сложную структуру (сложный тип) - массив; одним из основных свойств массива является однотипность его компонент. Многие информационно-логические задачи связаны с обработкой документов, содержащих в себе информация разного типа (числовую, символьную и т. д.) Примеры таких документов: пла­тежные ведомости (фамилии и имена - символьная информация, де­нежные суммы - числовая), карточки больных в поликлинике, библио­течная информация. Как обрабатывать такие данные с помощью строковых типов, показано в §3.1.3; при этом приходится выделять подстроки и переводить некоторые из них в число. Для упрощения программирования алгоритмов обработки такой информации необходимо иметь сложный тип, объединяющий разнотипные компоненты. Таким типом в Паскале является запись.

Запись - это переменная, состоящая из фиксированного числа компонент, вообще говоря, разного типа, причем каждая компонента имеет свое имя. Компоненты записи также называются полями записи. Сравним два типа - массив и запись. Компоненты массива имеют одинаковый тип; компоненты записи могут иметь разный тип (хотя могут быть и однотипны). Для обращения к элементу массива надо указать его номер (индекс), при обращении к полю записи указывается его имя.

Описание типа запись:

TYPE имя_типа = RECORD

список_1_имен_полей: тип_1;

список_2_имен_полей: тип_2;

...

список_N_имен_полей: тип_N;

END;

 

Например:

TYPE COMPLEX=RECORD{значения переменныx этого типа -
комплексные числа}

Re,Im:REAL {действительная и мнимая части}

END;

DATE = RECORD {для описания дат (число, месяц, год)}

Day: 1..31; {число}

Month = (January, February, March, April, May, June, July, August, September, October, November, December); {месяц}

Year: Integer; {год}

END;

BOOK = RECORD {для описания книг в каталоге библиотеки}

Author,Title,Publisher:String;

{автор, название, издательство}

Year,Volume,Pages:Integer;

{год издания,том,количество страниц}

END;

Память, занимаемая записью, равна сумме объемов памяти полей (если исключить из рассмотрения особенности, связанные с выравниванием). В любом случае для определения размера памяти записи можно использовать функцию sizeof(переменная_или_тип).

Для обращения к полю записи надо указать имя записи, а затем, через точку, имя поля. Например:

VAR C:COMPLEX; D,D1:DATE; B:BOOK;

BEGIN... C.Re:=5; D.Month:=January; B.Author:='Smith';

{*} D1.Day:=6; D1.Month:=June; D1.Year:=1799;{*}...

Чтобы не писать многократно имя записи при работе с ее полями, используется оператор

WITH Имя_записи DO оператор

Три оператора, ограниченные {*}, эквивалентны оператору:

WITH D1 DO

BEGIN Day:=6; Month:=June; Year:=1799

END;

Пример. Ниже приведена программа для задачи §3.1.3, использующая для отображения строки таблицы тип запись (вместо типа строка)

Program Toys;

TYPE SVED=RECORD {тип "запись", описывающий игрушку}

name:String; {название игрушки}

MinAge, MaxAge,Rub:Real;

{возрастные границы и стоимость}

END;

VAR N:Integer; {число наименований игрушек}

Toy:SVED; {переменная, описывающая игрушку}

max:Real; {максимальная стоимость конструктора для детей до 7 лет}

namemax:String; {название искомого конструктора}

i:Integer; {счетчик наименований игрушек}

BEGIN

Writeln(' Введите число наименований игpушек');

ReadLn(N);

max:=0;

For i:=1 to N Do

With Toy Do {работаем с полями записи Toy}

BEGIN

Writeln('Введите название игpушки с номером', i:2);

Readln(name);

Writeln('Введите мин. и макс. возраст и стоимость');

Readln(Minage,Maxage,Rub); {вводим запись по полям}

If ((Pos('констpуктоp',name)>0) or {содержит ли название}

(Pos('Констpуктоp',name)>0)) and {слово "конструктор" }

(MaxAge<=7) Then

If Rub>max Then

BEGIN

max:=Rub;

namemax:=name

END;

END;

If max=0 Then

WriteLn(' Констpуктоpов для детей до семи лет нет')

Else

BEGIN

WriteLn('Cамый доpогой констpуктоp для детей до семи лет');

WriteLn(namemax);

WriteLn('стоит ', max:6:0, ' pублей')

END;

END.

Замечания:

1. Программа, использующая запись, конечно, алгоритмически проще, чем программа со строками. Платой за упрощение является разрушение структуры таблицы при вводе: строка таблицы распределяется по нескольким строкам экрана монитора компьютера.

2. Недостатки программы, отмеченные в §3.1.3, имеют место и для этой программы. Они устраняются использованием файлов.

Файлы

Общие понятия

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

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

В классическом понимании файл рассматривается как абст­рактное обобщение данных на устройстве с последовательным дос­тупом, типичным представителем которого является магнитная лента. В библиотеках современных языков программирования, ко­нечно, имеются средства и для работы с файлами прямого доступа.

Условно устройство с последовательным доступом можно представить как бесконечную ленту с фиксированным началом. Движение по этой ленте возможно только от начала, последовательно от компоненты к компоненте. Для достижения N -й компоненты необходимо пройти (N-1) предыдущих компонент. В оперативной памяти ЭВМ для каждого файла существует единственная ячейка, в которую информация может считываться из файла или из которой информация может записываться в файл; эта ячейка рассчитана точно на одну компоненту файла; она называется буфером (или окном, карманом). Используется также термин указатель файла. Это абстрактное понятие, соответствующее головке считывания-записи магнитной ленты или магнитного диска. Указатель стоит (указывает) на доступной (в каждый момент единственной!) компоненте файла.

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

Файлы бывают текстовыми и двоичными.

Текстовые файлы хранят информацию во внешнем представлении. Они имеют два основных признака: во-первых, их компонентами являются строки символов; во-вторых, эта символьная информация интерпретируется в соответствии с типом вводимых или выводимых переменных. Эти файлы являются обобщением данных на устройстве CON (т.е. вводимых с клавиатуры или выводимых на экран компьютера). Умение работать с текстовыми файлами необходимо даже начинающим программистам, так как на устройстве CON данные существуют малый промежуток времени, а обычно имеется потребность в их длительном хранении.

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

Двоичный файл - это последовательность байтов; обмен информации между двоичным файлом и переменными программы происходит без преобразования. В Турбо Паскале рассматривается два вида двоичных файлов: типизированные и нетипизированные. В случае типизированных файлов байты файла разбиваются на ячейки в соответствии с типом компонент файла; например, для файла с базовым типом integer каждая пара байтов (для 32-разрядных компьютеров – четверка) рассматривается как целое значение; типизированные файлы хранят данные во внутреннем представлении. Для нетипизированных файлов представление информации безразлично, файл рассматривается как последовательность нулей и единиц.

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

Файлы в Турбо Паскале

Файлы бывают текстовые, типизированные и нетипизированные.

Функция EOF [20](имя_файла) применяется к файлам любого вида. Она возвращает значение TRUE при чтении конца файла, иначе возвращает FALSE.

Все процедуры, использующие файлы, не работают без других, подготовительных, процедур: ASSIGN [21], RESET, REWRITE.

Процедура ASSIGN связывает программное имя файла (т.е. имя переменной, описанной как файл) и его физическое имя (т.е. имя файла на диске или имя устройства, записанное по правилам операционной системы). Обращение к процедуре имеет вид:

ASSIGN (програм_имя_файла, физич_имя_файла).

Процедура RESET (имя файла) подготавливает файл к чтению (вводу). В случае отсутствия файла с заданным физическим именем процедура выводит сообщение об ошибке. В случае существования файла производятся следующие действия. Если файл не пустой, то указатель устанавливается на первую компоненту, значение первой компоненты пересылается в буфер, функция EOF принимает значение FALSE. Если файл пуст, то содержимое буфера считается неопределенным, а функция EOF устанавливается в значение TRUE.

Процедура REWRITE (имя_файла) подготавливает файл к записи (выводу). Если файл с заданным физическим именем не существует, то делается попытка создать файл. Далее файл очищается; указатель устанавливается на первую компоненту; функция EOF принимает значение TRUE.

RESET и REWRITE называются процедурами открытия файла (для чтения и записи, соответственно). Процедура APPEND (имя_файла) открывает текстовый файл для дополнения.

После окончания работы с файлом необходимо его закрыть с помощью процедуры CLOSE [22] (имя_ файла). Под закрытием файла понимается его сохранение и перерегистрация в каталоге. Кроме того, в результате закрытия файла разрушается связь между программным и физическим именами файла, определенная оператором ASSIGN; использование программного имени файла становится невозможным (до повторного применения ASSIGN и открытия файла).

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

Для описания переменной типа текстовый файл используется ключевое слово TEXT [23]:

VAR имя_текст-файла: TEXT;...

Процедуры считывания из текстового файла (записи в него) отличаются от привычных процедур ввода с клавиатуры (вывода на экран) только тем, что в скобках перед списком ввода (вывода) указывается имя файла:

READ (имя-файла, список_ввода);

WRITE (имя_файла, список_вывода)

READLN (имя_файла, список_ввода);

WRITELN (имя_файла, список_вывода)

Если имя файла отсутствует, то используется имя CON.

Функция EOLN [24](имя_файла) применима только к текстовым файлам (так же, как и процедуры READLN и WRITELN); она возвращает значение TRUE, если считан конец строки, иначе возвращает значение FALSE.

Далее приведены программы, исходные и выходные данные которых хранятся в текстовых файлах.

Пример 1

program Primer1_3_3_3;

{В текстовом файле Х хранятся сведения об игрушках}

{в текстовый файл Y записываются сведения}

{о конструкторах для детей до 7 лет}

Type sved=record

name:string;

minage,maxage:integer;rub:real;

end;

Var x,y:text; toy:sved;

Begin

Assign (x,'d:\student\xtext.txt');

Assign(y,'d:\student\ytext.txt');

{физические имена файлов выбраны произвольно}

reset(x); rewrite(y);{x открывается для чтения, у - для записи}

if eof(x) then writeln('x - пустой')

else

Begin

while not eof(x) do

with toy do

Begin

readln(x,name); {запись считывается по полям}

readln(x,minage,maxage,rub);

if((pos('конструктор',name)>0) or pos('конструктор',name)>0))

and (maxage<=7) then

writeln(y,name); {запись выводится по полям}

writeln(y,minage,maxage, rub:8:0);

End;

End;

Close(x); Close(y);

End.

Пример 2

Program Primer2_3_3_3;

{Сведения о багаже авиапассажира состоят из фамилии, имени, отчества, количества вещей, общего веса багажа и признака наличия фотоаппаратуры. Сведения хранятся в текстовом файле. Вывести в другой текстовый файл фамилии, имена, отчества пассажиров, имеющих фотоаппаратуру. Кроме того, вывести на экран число пассажиров, вес багажа которых превышает 20 кг, и число пассажиров, у которых средний вес одной вещи больше 15 кг.}

Type Bagpas=Record {тип Bagpas - это запись, содержащая сведения о багаже одного пассажира}

Fio:String; {ФИО пассажира}

Kv: integer; {количество вещей пассажира}

P:Real; {вес багажа}

Foto:integer; {Foto=1, если фотоапаратура есть;

Foto=0, в противном случае}

End;

Var Pas:Bagpas; {cведения о багаже одного пассажира}

NameF:array [1..20] of string;

{массив ФИО пассажиров, имеющих фото}

Nf:integer; {число пассажиров, имеющих фото}

N20:integer;{число пассажиров, вес багажа которых больше 20 кг}

N15:Integer;

{ число пассажиров, у которых средний вес вещи больше 15 кг}

i:Integer; { счетчик пассажиров}

F,G:text;

Begin

Assign(F,'d:\student\bag');

Reset(F);

Assign(G,'d:\student\fotores');

Rewrite(G);

If eof (F) then

Writeln (' Пуст файл исходных данных')

Else

Begin

Nf:=0; N20:=0;N15:=0;

While not eof(F) do

With pas do

Begin

Readln(F,Fio);

Readln(F,Kv);

Readln(F, P);

Readln(F,Foto);

If Foto=1 then

Begin

Nf:=Nf+1;

Writeln(G,Fio);

End;

If P>20 Then N20:= N20+1;

If P/Kv>15 Then N15:=N15+1;

End;

If Nf=0 Then Writeln(' Пассажиров с фотоаппаратурой нет')

Else

Begin

Writeln(

' Фамилии пассажиров с фотоаппаратурой в файле foto');

End;

Writeln(' Багаж больше 20 кг у',N20:3,' пассажиров');

Writeln(' Cредний вес одной вещи больше 15 кг у', N15:3,' пассажиров');

End;

Close(F);

Close(G);

End.

Замечание. Текстовые файлы можно ввести в ЭВМ, прочитать, исправить с помощью текстового редактора.

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

Описание типизированного файла:

VAR Имя Файла: FILE OF Базовый Тип;...

Базовый тип - любой, но не файл.

Процедуры чтения из файла и записи в файл:

READ (Имя Файла, Список Переменных)

WRITE( Имя Файла, Список Переменных)

Cписок переменных содержит переменные только базового типа.

Операторы READLN и WRITELN не имеют смысла, так как компоненты файла не являются строками.

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

Пример 1. Рассматриваются данные об игрушках из примеров §§3.1.3, 3.2, 3.3.3. Приведенные три программы должны работать последовательно друг за другом.

program texttyp {пpеобpазование текст.файла в типизиpованный};

type sved=record

name:string;

minage,maxage:integer;rub:real;

end;

var xtext:text; x:file of sved; toy:sved;

Begin Assign(xtext,'G:\valia\xtext'); Assign(x,'G:\valia\x');

{xtext готовится в текстовом редакторе, х получается программно}

reset(xtext);rewrite(x);

if eof(xtext) then writeln(' Исходный текстовый файл пуст')

else

Begin

while not eof(xtext) do

Begin

with toy do

Begin

readln(xtext,name);

readln(xtext,minage,maxage,rub);

End;

write(x,toy);

End;

End;

Close(x); Close(xtext);

End.

program TypFile;

{из типизированного файла х в типизиpован. файл y записываются }

{ сведения о констpуктоpах для детей до семи лет}

Type sved=record

name:string;

minage,maxage:integer;rub:real;

end;

Var x,y:file of sved; toy:sved;

Begin

Assign (x,'g:\valia\x');

Assign(y,'g:\valia\y');

reset(x); rewrite(y);

if eof(x) then writeln('x - пустой файл')

else

Begin

while not eof(x) do

Begin read(x,toy);{считывается запись полностью}

with toy do

if ((pos('констpуктоp',name)>0) or

(pos('Констpуктоp',name)>0))

and (maxage<=7) then

write(y,toy);

End;

End;

Close(x); Close(y);

End.

program typtext; { перевод типизированного файла в текстовый}

type sved=record

name:string;

minage,maxage:integer;rub:real;

End;

Var y:file of sved; ytext:text; toy:sved;

Begin Assign(y,'G:\valia\y'); Assign(ytext,'G:\valia\ytext');

reset(y);rewrite(ytext);

if eof(y) then writeln(' типизированный файл пуст')

else

Begin

while not eof(y) do

Begin

read(y,toy);

With toy do

Begin

writeln(ytext,name);

writeln(ytext,minage,maxage,rub:7:0);

End;

End;

End;

Close(y); Close(ytext);

End.

Замечание. В типизированном файле все компоненты занимают одинаковое количество байтов памяти, поэтому можно определить адрес начального байта каждой компоненты по её номеру. Подпрограммы, использующие эту возможность, называются подпрограммами прямого доступа. Они приведены ниже.

Функция FILESIZE (ИмяФайла) возвращает число компонент файла.

Функция FILEPOS (ИмяФайла) возвращает номер компоненты, которая будет обрабатываться следующей процедурой ввода-вывода.

Процедура SEEK (ИмяФайла, №компоненты) смещает указатель к требуемой компоненте.

Компоненты файла нумеруются с нуля. Следовательно, оператор SEEK (ИмяФайла, FILESIZE (ИмяФайла)) переместит указатель к концу файла.

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

Пример 2. Приведенная ниже программа заменяет в типизированном файле целых чисел нулевые значения на значение a, задаваемое вводом. Для подготовки типизированного файла и его просмотра требуется написать программы, аналогичные TextTyp и TypText примера 1.

program Project1;

Var F:file of integer; a,b:integer;

begin

AssignFile(f, 'ftyp');{файл ftyp поготовлен с помощью}

Reset(F); {специальной программы}

If eof (F) then

writeln (' File is empty')

else

Begin

writeln('Input a');

readln(a);

while not eof(F) do

begin

read(F,b);

if b=0 then

begin

seek(F,filepos(F)-1);{возврат к компоненте, равной 0}

write(F, a){замена нулевого значения на а}

end

end;

CloseFile(F); writeln('end');

End; Readln

end.

Совет: не стоит использовать процедуры прямого доступа при последовательной записи или последовательном считывании компонент, это увеличит время работы программы.

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

Описание нетипизированного файла:

VAR ИмяФайла: FILE;

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

Процедуры открытия нетипизированного файла:

RESET (ИмяФайла, РазмерЗаписиВбайтах) – для чтения,

REWRITE (ИмяФайла, РазмерЗаписиВбайтах) – для записи.

Запись – это минимальное количество передаваемых за одно обращение к устройству байтов. Размер записи по правилу умолчания равен 128. За одно обращение к устройству передается блок из N записей. Высокоскоростная передача данных получается, когда размер блока равен кластеру. Кластер – количество байтов, считываемых за один поворот диска. Типичный размер кластера – 512 или 1024.

Процедуры чтения и записи для нетипизированного файла:

BLOCKREAD (ИмяФайла, Буфер, N, NN)

BLOCKWRITE (ИмяФайла, Буфер, N, NN),

где буфер - переменная для считывания (записи) информации, NN - число считанных записей (NN<=N, строгое неравенство возможно для последнего блока).

Пример. Процедура копирования файлов произвольного типа.

Procedure Kopir(infile,outfile:string);

Var f1,f2:file; Buf:array[1..Klaster] of Byte; i:word;

{Klaster - глобальная константа, размер кластера}

Begin assign(f1,infile); assign(f2,outfile); reset(f1,1); rewrite(f2,1);

repeat

BlockRead(f1,Buffer, Klaster,i);

BlockWrite(f2,Buffer, Klaster,i)

until eof(f1);

close(f1); close(f2);

End.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 158; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.138.137.244 (0.009 с.)