settextbuf(f, buf);
reset(f);
while not eof(f) do
begin
read(f, c);
…………………
end;
…………………
12). Flush (f) – очищаетбуферт. ф., открытогодлявыводапр-ройRewrite илиAppend. По этой пр-ре инфо из буфера, независимо от степени его заполненности, записывается во внешний файл. Данная пр-ра исп-ся редко.
13). EOF (f);
14). EOLn (f);
15). SeekEOF (f) – устанавливает файл в состояние конец файла (аналог EOF, но пропускает все пробелы, метки, табуляции и маркеры конца строки). Обычно исп-ся при считывании числовых значений из т. ф. Определена только для т. ф.
16). SeekEOLn (f) – аналог 11), но пропускает пробелы и метки табуляции. Исп-ся при считывании цифровой информации из т. ф.
Вопрос №32.
Сравнительная характеристика файлов с типом и текстовых файлов.
1) Представление численной инфы:
…в txt файле – код ASCII – 1 байт под каждую цифру
8 1 9 2пробел
0011|1000|0011|0001|0011|1001|0011|0010|0010|0000|
код -//- -//-
зоны
2 0 4 8
0011,0010|0011,0000|0011,0100|0011,1000|0010,000
…в fileofinteger
15
4байта 0010|0000|0000|0000|0000|1000|0000|0000|
| 8192 | 2048 |
Если работаем с числовой инфой, и ее не нужно выводить на экран, то эффективней использовать файл с типом – меньше места в памяти; скорость работы выше (отсутствует преобразование инфы, прямой доступ).
2) Представление текстовой инфы
…в txt файле:
|Э|К|З|А|М|Е|Н|#13|#10|
|П|О|#13|#10| 31 байт
|П|Р|О|Г|Р|А|М|М|И|Р|О|В|А|Н|И|Ю|#13|#10|
...file of string [16]
|#17|Э|К|З|А|М|Е|Н|#0|#0|#0|#0|#0|#0|#0
|#2 |П|О|#0|#0|#0|#0|#0|#0|#0|#0|#0|#0|#0 51 байт
|#16|П|Р|О|Г|Р|А|М|М|И|Р|О|В|А|Н|И|Ю
меньше места занимает txt файл
большая скорость работы – fileofstring (прямой доступ, не отслеживаются управляющие символы).
Вопрос №33.
Файлы без типа. Синаксис задания. Назначение. Факторы повышения скорости обмена информацией. Процедуры и функции, определенные над файлами без типа. Пример.
Файл без типа состоит из компонентов одинакового размера. Структура этих компонентов не известна или не имеет значения, и это стирает все различия между файлами любых типов. Любой файл, независимо от того как он был создан, можно работать с ним, как с файлом без типа.
Назначение. Мах повысить скорость обмена информацией с внешним набором данных. Скорость обмена информацией повышается за счет:
- В ф.без типа отсутствует преобраз. типа компонент;
- не выполняется поиск управляющих символов;
- обмен информации с внешними наборами данных может осуществлятся с внешними блоками;
- к ф.без типа возможна организация прямого доступа.
Для ф.без типа определены те же процедуры и функции, что и для ф.с типом, за исключением Read и Write.
Проц. Reset и Rewrite имеют особенности.
Reset (F[ , Resize]);
Rewrite (F[ , Resize]);
Параметр Resize (размер записи) – это необязат. выраж. (word) определяется размер записи в байтах используемый при передачи данных. Если Resize опущен, то длина записи =128 байт.
*Вместо Read используется BlockRead:
BlockRead (F, Buf, Count [ , Result]);
Buf – переменная любого типа;
Count – выражение типа Word, определяет кол-во считываемых записей;
Result – переменная типа Word.
BlockRead(F,Buf,Count[Rezult]); считывает блок информации длиной Count или меньше записей в области памяти занимаемой переменной Buf.
Действительное число считываемых полных записей ≤Count, заностися в параметр Result.
Если Result<Count следовательно достигнут конец файла. В этом случае, если Result отсутствует, возникает сообщение об ошибке ввода/вывода. В результате выполнения окно файла переместится на число Result.
Объем блока информации считывается проц. Read в Buf, заним. Result*Resize файла. Размер блока не должен превышать 64 кбайт.
*Вместо Writeиспользуется BlockWrite:
BlockWrite (F, Buf, Count [ , Result]);
Процедура записывает одну или несколько записей из области памяти, занимаемых переменой Buf файл F, переметр Result возвращает кол-во полных записанных записей.
Если Result<Count – диск переполнен.
Программа быстрого копирования ф.F1 в ф.F2:
Program Copy File;
Var F1,F2:File;
Buf: array[1..2048] of char;
Nr,Nw:Word;
Begin
Assign (F1, ‘Data1’);
Assign (F2, ‘Data2’);
Reset (F1,1);
Rewrite (F2,1);
Repeat
BlockRead (F1, Buf, Sizeof(Buf), Nr);
BlockWrite (F2, Buf, Nr,Nw);
Until (NR=0) or (NR< >1);
Close (F1);
Close (F2);
End.
Вопрос №34.
Проверка операций ввода-вывода. Пример.
По умолчанию при выполнении операций ввода-вывода осуществляется их стандартная проверка системными средствами. Длэ этого служит дирректива компилятира {$I+}. При этом, если возникла ошибка, она сообщает, но если это нежелательно, то необходимо отключить стандартную проверку ввода-вывода. С этой целью исп-т {$I-}. Для контроля ввода-вывода в сост. {$I-} служит ф-ция IOResult (ф-ция без параметров). Ф-ция возвращает целое значение типа Word, которая является состоянием послед. выполн. операции ввода-вывода, если ошибки не было ф-ция возвращиет значение 0, в противном случае возвращает код ошибки. Если $I в состоянии (-) и при некоторой операции ввода-вывода произошла ошибка, то все последние операции ввода-вывода использованные до вызова IOResult будут гнорироваться. Не желательно использовать один вызов ф-ции IOResult на несколько операций ввода-вывода, т.к. не ясно в какой из них произошла ошибка. При вызове IOResult возвращенное значение ф-ции устанавливается в 0, следовательно нельзя повторно считать.
Var F:File of char;
Begin
Assign (F,’Primer’);
{$I-}
Reset (F);
{$I+}
if IOResult =0 then
WriteLn (‘Размерфайла’, Filesize (F),’_ Байт’);
else
WriteLn (‘Файлненайден’);
end.
Вопрос №35.
Ссылочный тип.
Автоматич. переменные – это перем., порождаемые перед выполнением проги или подпроги, котоые сущ-ют в течение всего времени ее выполнения. Объем памяти, необход. для хранения автом. перем., не изменяется в ходе выполнения проги. Автом. перем. опред. в var. Обращение к ним осущ-ся с пом. их имен.
Дин. переменные – это перем., кот порождаются и уничтож. в процессе выполнения проги, размер значений которых опред. или измен. при выполнении проги.
Для работы с дин. перем. исп-ся ссылочный тип (указателей), значением этого типа явл. ссылка на некоторую перем., и уже по данной ссылке осущ-ся доступ к самой переменной.
<Тип_указателей>::=
→^→<ид._типа>→
└→→Pointer→→┘
В кач-ве ссылки исп-ся адрес соотв. переменной в памяти машины. Ид. типа – это дин. размещаемой перемен. В кач-ве типа может исп-ся имя станд. или отдельно описанного типа.
type mas=array [1..10] of integer;
admas=^mas;
p1=^integer;
var p:^integer;
q:^char;
pp:p1;
pt:pointer;
adrm:admas;
Сами указатели явл. автом. перемен. ссылочного типа. Указатель занимает 4 байта. Дин. переменные в проге не объявляются => единств. средством доступа к ним явл. указатели. Иногда необход. в кач-ве значения указателя принять пустую ссылку (не связывать с данным указателем дин. переменную). Для этого исп-ся nil. константа nil совместима с любым типом указателя.
Над значениями ссылочного типа нет операций, которые давали бы результат того же типа. Определены только присваевание и 2 операции сравнения (:=, <,>).
Два значения ссылочного типа равны, если они оба есть nil либо указывают на одну и ту же динамическую переменную. В правой части оп-ра :=-ния исп-ся ссылочное выражение того же типа, что и переменная в левой части. В качестве ссылочного выражения может исп-ся:
1. nil;
2. ссылочная переменная;
3. ссылочная функция;
Объявление ссылочной переменной в разделе Var не порождает самой динамической переменной. По этому объявлению транслятор только отводит место в памяти для размещения указателя.
Вопрос №36.
Процедуры New и Dispose.
Для порождения дин. переменной исп-ся проц-ра new(p), р – ссылочная переменная любого типа. New размещает дин. переменную типа указатель. Переменной выделяется память, достаточная для хранения наиболее длинного значения типа указателя. Адрес начала данного места памяти присваивается р. Для дин. переменных new играет ту же роль, что раздел var для автоматических переменных. Никакого значения new дин. переменной не присваивает. Для обращения к дин. перем. исп-ся
<переменная_с_указателем>::=
<ссыл._перем.> ^.
☻Пример:
var p:^integer; x:integer;
………….
new(p);
p^:=15;
x:=x+p^;
p^:=p^ mod 5;
adrm^[p^+2]:=14;
Над переменными с указателями определены любые операции, допустимые для переменных того же типа, что и тип дин. переменной.
Возможна организация массивов указателей:
typep1=^integer;
var a:array[1..20] of integer;
……………..
for i:=1 to 20 do
new(a[i]);
……………..
a[i]^:=25;
!!! Идентификатор типа в определении ссыл. типа может быть объявлен как до, так и после его исп-ния, в отличие от всех других типов.
Пример:
type admas=^mas;
mas=array [1..10] of integer;
Пример:
varx,y:^integer;
begin
new(x);
new(y);
x^:=5;
y^:=10;
x:=y;
y:=nil;
Переменная типа указатель может являтся параматром ф-ции ord(p). Рез-татом этой ф-ции явл. целое значение, равное адресу дин. переменной, на которую ссылается указатель р. Обратное преобразование не допускается.
Для уничтожения дин. переменной исп-ся dispose(p). В рез-те ее выполнения дин. преременная, связанная с указателем р уничтожается. Занимаемая ею память считается свободной. Значение р становится неопределенным (= nil). Dispose уничтожает только дин. перем., но не указатель на нее..
Вопрос №37.
Процедуры Getmem и Freemem.
getmem (p,size)
freemem (p,size)
р – указатель любого типа
size – выражение типа word.
getmem выделяет из области дин. памяти (heap-область) блок памяти длиной size байт и адрес этого блока присваивается р. Макс. размер блока: 64 кбайт–(минус) смещение. Для освобождения блока памяти исп-ся freemem, кот. уничтожает дин. переменную p^, заним. ею память счит. свободной, значение p=nil.