Процедуры прямого доступа к компонентам файла — КиберПедия 

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Процедуры прямого доступа к компонентам файла

2020-05-07 208
Процедуры прямого доступа к компонентам файла 0.00 из 5.00 0 оценок
Заказать работу

Формирование файла В Турбо Паскаль-программе выполняется только последовательно (см. часть 3). Проверка информации в файле, приведённая в программе на рис.7, выполняется также в режиме последовательного доступа. Напоминаем, что в этом режиме указатель текущей компоненты после каждой логической операции записи или чтения компоненты сдвигается к концу файла ровно на одну компоненту, т.е. автоматически устанавливается на следующую компоненту.

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

Установка указателя на требуемую компоненту выполняется обращением к процедуре

SEEK(f,i);

f – имя файловой переменной;

i – номер требуемой компоненты (переменная или константа целого типа).

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

 

N:=Filesize(f); - функция определения количества компонент в файле;

K:=Filepos(f); - функция определения номера текущей компоненты в файле;

Truncate(f); - процедура отсечения части файла, начиная с текущей компоненты и до конца файла (укорочение файла).

f – имя файловой переменной.

 

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

изменять значение компоненты или некоторого поля компонент;

исключать компоненту из файла;

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

Напоминаем, что любой модификации может быть подвержен любой файл, открытый для чтения.

 

РЕКОМЕНДУЕМАЯ ПОСЛЕДОВАТЕЛЬНОСТЬ ПРОГРАММНЫХ ДЕЙСТВИЙ ПРИ ОБРАБОТКЕ ФАЙЛОВ

1) Объявить все имена файлов в заголовке программы.

2) Объявить имя файла в разделе объявлений данных; объявить имя логической компоненты.

3) Выполнить обращение к процедуре связывания логического и физического файлов.

4) Если необходимо, сформировать файл:

     открыть для записи;

     выполнить цикл записи компонент в файл;

     закрыть файл.

5) Если необходимо распечатать сформированный программой или ранее сформированный файл:

     открыть для чтения;

     распечатать компоненты в режиме последовательного доступа;

     закрыть файл.

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

7) Закрыть файл.

 

ФАЙЛЫ В КАЧЕСТВЕ ПАРАМЕТРОВ ПОДПРОГРАММ

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

 

Примеры решения задач на обработку файлов

Пример 1.

Создать файл, состоящий из последовательности чисел целого типа. Вычислить среднее арифметическое квадратов нечётных компонент файла. Исходный файл распечатать.

 

Тестовый пример:

Созданный файл:

 

S:=32+52+72+12=84; S – сумма квадратов нечётных компонент в файле f.

K=4;                         K – количество нечётных компонент в файле f.

;            SR – среднее арифметическое нечётных компонент.

 

Блок-схема алгоритма приведена на рис.8.

 

 

Шаги основного проекта алгоритма пояснены в предыдущих параграфах и не требуют детализации в виде блок-схемы.

Программа на языке Турбо Паскаль приведена на рис.9.

 

Program Pr1(f);

{Формирование файла из целых чисел и вычисление ср. арифметического нечётных компонент}

TYPE FAL=file of integer;

VAR f: FAL;           {имя файловой переменной}

     K: integer;      {счётчик нечётных компонент}

     S, a: integer;   { S – сумма квадратов нечётных компонент,

                                 а – компонента логического файла}

SR: real;         { SR - среднее арифметическое нечётных компонент файла}

name: string[20]; { метка файла }

     Begin

              writeln(‘Введите имя файла: ‘);

              readln(name);

              ASSIGN(f,name);

{ писать в файл }

REWRITE(f);

writeln(‘Признак конца ввода – 999’);

writeln(‘Вводите очередное целое число’);

     read(a);

     while a<>999 do

              begin

                        write(f,a);

                        Writeln(‘Вводите очередное целое число’);

                        read(a);

              end;

     CLOSE(f); { Файл сформирован }

     writeln(‘Сформирован файл’);

     { Просмотр созданного файла }

     RESET(f);

     while not EOF(f) do

              begin

                        read(f,a);

                        write(‘ ‘,a);

              end;

     CLOSE(f); { Просмотр завершён }

     {Вычислено ср. ар. нечётных компонент файла f }

     RESET(f); {Открыть файл для обработки}

     S:=0;

     K:=0;

     while not EOF(f) do

              begin

                        read(f,a);

                        if (a mod 2)<>0 then

                                 begin

                                           S:=S+SQR(a);

                                           K:=K+1;

                                 end;

              end;

     CLOSE(f);

              SR:=S/K;

              writeln(‘ср. ар. = ’,SR:6:2)

end. {Pr1}

Рис.9

 

Пример 2.

Даны символьные файлы f1 и f2. Переписать с сохранением порядка следования компоненты файла f1 в файл f2, а компоненты файла f2 - в файл f1. Вспомогательный файл не использовать. Блок-схема основного проекта приведена на рис.10.

               

 

 

Программа алгоритма обмена содержимым символьных файлов f1 и f2 приведена на рис.11.

 

Program Pr2(f1,f2);

{Программа создаёт два символьных файла и выполняет обмен их содержимым}

Var

n1,n2: integer; {соответственно кол-во компонент в файле f 1 и

в файле f2}

f1,f2: file of char;

a,b: char     {компоненты логического файла}

Begin

     ASSIGN(f1,’e:\Cat\d1.dat’);

     ASSIGN(f2,’e:\Cat\d2.dat’);

     Rewrite(f1);     {файл f 1 открыт для записи}

     write(‘Пиши в файл f1 символы’);

     writeln(‘Признак конца ввода - *’);

     readln;   {очистить буфер перед вводом первого символа}

     read(a);

     while a<>’*’ do

              begin

                        write(f1,a);

                   read(a);

              end;

CLOSE(f1);

     Rewrite(f2);     {файл f 2 открыт для записи}

     write(‘Пиши в файл f2 цепочку символов’);

     writeln(‘Признак конца ввода - *’);

     readln;

     read(a);

     while a<>’*’ do

              begin

                        write(f2,a);

                        read(a);

              end;

CLOSE(f2);

     writeln(‘Файлы: f1, f2 созданы’);

     {обмен компонентами, пока файлы f1 и f2 не кончились}

     Reset(f1);

     Reset(f2);

     while(not eof(f1)) and (not eof(f2)) do

              Begin

                        read(f1,a);

                        read(f2,b);

                        {после чтения компоненты указатель переместился за

компоненту }

seek(f1,filepos(f1)-1);

seek(f2,filepos(f2)-1);

{Перед обменом компонентами файлов f1 и f2 указатель необходимо вернуть назад на одну компоненту, иначе компоненты будут записаны на место последующих компонент}

write(f1,b);

write(f2,a);

                        end;

     n1:=filesize(f1);

     n2:=filesize(f2);

     {Дописать остаток более длинного файла}

     if n1>n2 then

                        { файл f1 длиннее файла f2}

              begin

                        while not eof(f1) do

                                 begin

                                           read(f1,a);

                                           write(f2,a);

                                 end;

              {усечение «хвоста» более длинного файла f 1}

                        seek(f1,n2); truncate(f1);

              end

                        else

                                           {файл f 2 длиннее файла f 1}

                                 begin

                                           while not eof(f2) do

                                                     begin

                                                              read(f2,a);

                                                              write(f1,a);

                                                     end;

              {усечение «хвоста» более длинного файла f 2}

                                      seek(f2,n1);

truncate(f2);

                                 end;

              { распечатать файл f1}

     writeln(‘Файл f1 после обмена’);

     seek(f1,0);

     while not eof(f1) do

              begin

                        read(f1,a);

                        write(a);

              end;  

     writeln(‘Файл f2 после обмена’);

     seek(f2,0);

     while not eof(f1) do

              begin

                        read(f2,a);

                        write(a);

              end;  

     Close(f1);

     Close(f2);

end. {Pr2}

Рис.11

 

Пример 3.

В заданной целой матрице A(m,n) строки, не содержащие ни одного нуля, переписать последовательно в файл f. Если файл не сформирован, сделать сообщение. Начальная строка при обработке матрицы – первая.

 

Тестовый пример:

 

 

В тестовой матрице вторая строка должна быть переписана в файл f. Очевидно, файл не будет сформирован, если в каждой строке матрицы встретится хотя бы один нуль.

Блок-схема основного проекта приведена на рис.12.

 

 

 

 


На рис.13 показана последовательная обработка строк:

kF – переменная-флажок, сигнализирующая, что хотя бы одна строка в файл будет записана (kF=1);

i – номер обрабатываемой очередной строки;

j – текущий номер элемента в строке;

ki – переменная-флажок: ki=0, если нет ни одного нулевого элемента в строке; ki=1, если есть хотя бы один нуль в строке.

N – количество столбцов матрицы, M – количество строк матрицы.

 

Остальные шаги на рис.12 не требуют детализации. Программа алгоритма задачи приведена на рис.14.

 

Program PR3(f);

{формирование файла из элементов строк матрицы A (M, N), не содержащих нулевых элементов}

Const M1=50;

     N1=70;

Var

     A: array [1..M1,1..N1] of integer;

     f: file of integer;

h: integer; {логическая компонента файла}

kF,ki,i,j,M,N: integer;

Begin

     ASSIGN(f,’E:\ARTM\fil.dat’);

     { формируем матрицу }

     writeln(‘Введите M – кол. строк матр., N – кол. столбцов’);

     write(‘M=’); readln(M);

     write(‘N=’); readln(N);

     writeln(‘Введите матрицу строками’);

     for i:=1 to M do

              for j=1 to N do

                        read(A[i,j]);

     { открываем файл для записи }

     rewrite(f);

     {выполняем просмотр строк матрицы: строки,

не содержащие нулей, записываем в файл f }

     kF:=0;    {флаг формирования файла}

       for i:=1 to M do

              begin(i)

                        ki:=0; {флаг наличия нуля в строке}

                        j:=1;

     { начало просмотра очередной строки }

     REPEAT

              IF A[i,j]=0 then

                        begin

                                 ki:=1; {в строке есть нуль}

                                 j:=n {необходимо закончить просмотр строки}

                        end;

                                 j:=j+1

                        until j>n; {конец просмотра очередной строки}

                        {есть нуль в строке i?}

              IF ki=0 then

                        {в строке нет нуля, пишем её в файл}

                        begin

                                 kF:=1;    { файл сформирован }

                                 for j:=1 to N do

                                           begin

                                                     b:=A[i,j];

                                                     write(f,b)

                                           end;

                        end; {i} close(f);

              { файл сформирован?}

              IF kF=1 then

                        { файл сформирован, распечатать его }

                        begin

                                 reset (f); {открываем файл для чтения}

                                 while not EOF (f) do

                                           begin

                                                     read(f,b);

                                                     write(‘ ‘, b)

                                           end;

                                 close (f)

                        end

              else

                        writeln(‘файл не сформирован’);

end. { Pr 3}

Рис.14


Поделиться с друзьями:

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

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

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.083 с.