Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы_алгоритм_и_программир_2курс_ПИ .doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
720.9 Кб
Скачать

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

Нетипизированные файлы объявляются как файловые переменные типа Fi1е

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

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

var F: File;

begin

AssignFile(F, 'myfile.dat');

Reset(F, 512);

end:

Длина записи нетипизированного файла указывается вторым параметром при обращении к процедурам Reset или Rewrite, в качестве которого может использоваться выражение типа LongInt. Если длина записи не указана, она принимается равной 128 байтам.

Object Pascal не накладывает каких-либо ограничений на длину записи нетипизированного файла, за исключением требований положительности и ограничения на максимальную длину в 2 Гбайт (для Delphi 1 длина записи ограничивается 65 535 байтами). Для обеспечения максимальной скорости обмена данными рекомендуется задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512 байт). Однако операции обмена данными с дисковыми устройствами в среде Windows кэшируются, то есть осуществляются через промежуточный буфер памяти, поэтому обычно задают RecSize = 1, что позволяет обмениваться с файлом блоками любой длины, начиная с одного байта.

При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам, за исключением процедур 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]) ;

Здесь Buf — буфер: имя переменной, которая будет участвовать в обмене данными с дисками; Count — количество записей, которые должны быть прочитаны или записаны за одно обращение к диску; AmtTransferred — необязательный параметр, содержащий при выходе из процедуры количество фактически обработанных записей.

После завершения процедуры указатель смещается на Count записей. Процедурами Seek, FilePos и FileSize можно обеспечить доступ к любой записи нетипизированного файла.

Урок № 25. Стандартные процедуры и функции при работе с файлами.

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

Итак, для выполнения операции чтения или записи необходимо произвести следующие действия:

1. Объявить файловую переменную необходимого типа.

2. При помощи функции AssignFile связать эту переменную с требуемым

файлом.

3. Открыть файл при помощи функций Append, Reset, Rewrite.

4. Выполнить операции чтения или записи. При этом, в зависимости от сложности задачи и структуры данных, может использоваться целый ряд вспомогательных функций.

5. Закрыть файл при помощи функции СloseFile.

Для контроля за текущей позицией в файле применяются две основные функции. Функция EOF(F) возвращает значение True, если достигнут конец файла. Функция EOLN(F) аналогично сигнализирует о достижении конца строки. Естественно, в качестве параметра в функции необходимо передавать файловую переменную.

Процедура Seek(var F; N: Longint); - обеспечивает смещение текущей позиции на N элементов. Размер одного элемента в байтах зависит от типа данных файла (от типизированной переменной).

Erase(f) - удаляет файл

FilePos(f) - возвращает текущую позицию чтения/записи в файл

Flush(f) - сбрасывает кэшированные файловые операции на диск

Rename(f, 'MyNewFileName.txt') - переименование файлов

Truncate(f) - файл обрезается до текущей позиции чтения/записи.

Пример 1. Дан текстовый файл с набором символов. Проверить, есть ли в файле сочетание символов «abcdef», входящих в строку.

Program Stroki;

label l1;

Var

t,K:string;

i,l:integer;

f:text;

Begin

assign(f,'c:\str.txt');

reset(f);

readln(f,t);

l:=0;

for i:=1 to length(t) do

begin

k:=copy(t,i,6);

if k='abcdef' then l:=1;

end;

if l=1 then writeln('sochetanie "abcdef" vhodit v stroky')

else write('sochetanie "abcdef" ne vhodit v stroky');

readln;

end.

Пример 2. Имеется файл, содержащий массив из 10 вещественных чисел. Найти и вывести на экран все отрицательные элементы и сумму их квадратов.

program pr1;

var

X:array[1..10] of real;

i:integer;

Summa:real;

f:text;

begin

Summa:=0;

assign(f,'c:\tyh\ins.txt');

reset(f);

i:=1;

while not eof(f) do

begin

readln(f,X[i]);

if x[i]<0 then

begin

Summa:=Summa+X[i]*X[i];

writeln('x[',i:2,']=',' ',X[i]:8:3, ' Summa= ',summa:8:3);

i:=i+1;

end;

end;

readln;

close(f);

end.

Пример 3. Дан файл с именем «shisla.txt», содержащий целые числа. Проверить, является ли файл упорядоченным (отсортированным).

program hhh;

var

f:text;

n,i,K:integer;

begin

assign(f,'shisla.txt');

reset(f);

readln(f,N);

K:=N;

while not eof(f) do

begin

readln(f,N);

if K>N then

begin

writeln('file ne uporyadochen');

exit;

end

else

K:=N;

end;

writeln('file uporyadochen');

readln;

close(f);

end.

Пример 4. Дан файл, содержащий данные о сотрудниках: фамилия, год, месяц и день рождения. Выбрать и записать в другой файл данные тех сотрудников, которые родились в год быка, а затем выбрать тех сотрудников, которые родились осенью.

program t2;

label l1;

type

sotryd1=record

fam:string[8];

godrog:integer;

mes:integer;

den:integer;

end;

var

f1,f:text;

sotryd:sotryd1;

i:integer;

begin

assign(f,'a:\ishod.txt');

reset(f);

assign(f1,'a:\vish.txt');

append(f1);

writeln(f1,'Список сотрудников, родившихся в год быка:  ');

while not eof(f) do

begin

with sotryd do readln(f,fam,godrog,mes,den);

for i:=1 to 10 do

begin

if sotryd.godrog=1901+i*12 then

begin

writeln(f1,sotryd.fam,sotryd.godrog);

goto l1;

end;

l1: end;

end;

writeln(f1,'Список сотрудников, родившихся осенью');

reset(f);

while not eof(f) do

begin

with sotryd do readln(f,fam,godrog,mes,den);

if (sotryd.mes=9) or (sotryd.mes=10) or (sotryd.mes=11) then

writeln(f1,sotryd.fam,sotryd.mes);

end;

close(f);

close(f1);

end.

Пример 5. Составить программу для создания типизированного файла, содержащего информацию о студенте: имя, возвраст, является ли читателем городской библиотеки, № зачетки, группа.

program F_stud;

type

strud=record

name:string[8];

Age:integer;

Membbibl:boolean;

N_zachetki:integer;

Gruppa:string[4];

end;

var f:file of stud;

student:stud;

begin

AssignFile(f, 'c:\MyFile.rec');

Rewrite(f);

student.Name := 'Vitaly'; // или readln(student.name);

student.Age := 17; // или readln(student.Age);

student.Membbibl := True; // или readln(student.Membbibl);

student.N_zachetki := 12345; // или readln(student.N_zachetki);

student.gruppa := ‘2T2’; // или readln(student.gruppa);

Write(f, student);

Closefile(f);

End.

31