6. Работа с файлами.

6.1.Общие сведения о файлах
6.2.Процедуры и функции для работы с файлами

6.3.Особенности обработки типизированных файлов

6.4.Особенности обработки текстовых файлов

6.5.
Файлы без типа


6.1 Общие сведения о файлах. 

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

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

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

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

Для связи  файла в программе и файла на внешнем носителе используется процедура ASSIGN, где указывается имя файла в программе и имя файла на внешнем носителе.

Число записей файла произвольно, но в каждый момент времени доступна только одна запись. Длиной файла называют количество записанных компонент. Файл, не содержащий записей, называется пустым.

Каждая переменная файлового типа должна быть описана в разделе описания переменных var . Не допускается использование таких переменных в выражениях и операторах присваивания. Тип компонент файла может быть любым кроме файла.

В Турбо Паскале предварительно определен следующий стандартный тип:

TYPE TEXT = FILE OF CHAR;

 

В системе программирования Паскаль различаются 3 вида файлов:

·        файлы с типом записей (типизированные файлы);

·        текстовые файлы со строками неопределенной длины;

·        файлы без типа для передачи данных блоками записей.

 

При работе с файлами необходимо придерживаться следующих общих правил:

·        все имена файлов могут быть указаны в заголовке программы;

·        текстовые файлы должны быть описаны с типом TEXT;

·        каждый файл в программе должен быть закреплен за конкретным файлом на носителе процедурой ASSIGN;

·        открытие существующего файла для чтения или дозаписи производится процедурой RESET, открытие создаваемого файла для записи – процедурой REWRITE;

·        при окончании работы с файлом он должен быть закрыт процедурой CLOSE.

 

наверх

6.2 Процедуры и функции для работы с файлами. 

ASSIGN (<имя файла>,<имя файла на носителе>) – процедура устанавливает связь между именем файловой переменной и именем файла на носителе. Здесь <имя файла>  это файловая переменная, т.е. правильный идентификатор, объявленный в программе как переменная файлового типа. <Имя файла на носителе> – текстовое выражение, содержащее имя файла или имя логического устройства.  Перед именем файла на носителе может ставиться путь к файлу – имя диска и(или) имя текущего каталога и имена каталогов вышестоящих уровней.

RESET(<имя файла>) – процедура открытия существующего файла для чтения при последовательном доступе и для чтения и записи при прямом доступе. Указатель файла при этом устанавливается на первую запись (с 0 номером).

REWRITE(<имя файла>) – процедура открытия создаваемого файла для записи. Если файл с таким именем уже существовал, то он стирается. Указатель файла  устанавливается на первую запись.

READ(<имя файла>, <переменные>) процедура чтения очередных компонент файла в переменные, тип которых должен совпадать с типом компонент файла. Указатель файла при этом передвигается на количество прочитанных компонент.

WRITE(<имя файла>, <переменные>) – процедура записи содержимого переменных в файл согласно положению указателя. Указатель автоматически сдвигается на число записанных компонент.

SEEK(<имя файла>, <номер компоненты>) – процедура установки текущего указателя для чтения или записи требуемой компоненты файла. Используется для организации прямого доступа к записям файла.

CLOSE(<имя файла>) – процедура закрытия файла. Обязательно должна использоваться после создания файла, иначе может произойти потеря данных.

ERASE(<имя файла>) – процедура уничтожения файла. Открытый файл прежде должен быть закрыт.

RENAME(<старое имя файла>, <новое имя файла>) – процедура для переименования файла. Используется после закрытия файла.

IORESULTфункция возврата условного признака последней операции ввода-вывода. Если операция завершилась успешно, функция возвращает нуль. Функция становится доступной только при отключенном автоконтроле ошибок ввода-вывода. Директива компилятора {$I-} отключает, а {$I+} – включает автоконтроль ошибок. Если автоконтроль отключен и операция ввода-вывода привела к возникновению ошибки, устанавливается флаг ошибки и все последующие обращения к вводу-выводу блокируются, пока не будет вызвана функция   IORESULT.

FILEPOS(<имя файла>) – функция определения номера текущей записи файла.

FILESIZE(<имя файла>) – функция определения общего количества записей файла.

EOF(<имя файла>) – функция определения признака конца файла. Получает значение TRUE при чтении последней записи файла.

EOLN(<имя файла>) – функция обнаружения конца строки в текстовом файле. Имеет значение TRUE, если найден конец строки.

 

наверх

6.3 Особенности обработки типизированных файлов.

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

При последовательном доступе записи располагаются на внешнем носителе последовательно в порядке их поступления, т.е. чтение или запись I+1 компоненты возможно только после I –ой компоненты.

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

Общий вид описания типизированного файла:

 

TYPE < идентификатор типа >= FILE OF  < тип компонент >;

 

Например,

1) TYPE  T = FILE  OF REAL;

       VAR   F: T;

2) VAR  F: FILE  OF REAL;

3) TYPE ST= RECORD

A: STRING[10];

B: INTEGER;

C: REAL;

D: BYTE

       END;

       VAR  DAN: FILE OF ST;

 

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

Процедуры чтения и записи для файлов с типом READ и WRITE. Кроме того, используются процедуры и функции ASSIGN, RESET, REWRITE, SEEK, CLOSE, FILEPOS, FILESIZE, EOF. Процедура TRUNCATE обрезает файл на заданной файловой позиции.

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

Структура записи файла следующая:

-       фамилия;

-       табельный номер;

-       заработная плата.

 

type tz=record

     fio:string[10];

     tn:integer;

     zp:real

end;

var  zap:tz;

        fout:file of tz;

        fl:boolean;

        name:string;

begin

        repeat

               writeln('имя файла ');

    readln(name);

    assign (fout,name);

{$i-} reset(fout); {$i+}

    if ioresult=0 then

    begin

writeln('файл ',name,' уже есть');

close(fout);

fl:=false

    end

                                                   else

    begin

            rewrite(fout);

  fl:=true

    end

        until fl;

        with zap do

        repeat

    writeln('ввод  fio,tn,zp');

    readln(input,fio,tn,zp);

    write(fout,zap);

        until eof(input);

        close(fout);

        reset(fout);

                   with zap do

                    repeat

    read(fout,zap);

                       writeln(fio:15,tn:9,zp:8:2);

                  until eof(fout);

                  close(fout)

          end.

 

В начале программы выполняется ввод имени файла до тех пор, пока не будет введено имя несуществующего файла, т.к. в противном случае старый файл будет уничтожен и данные будут утеряны. После ввода нового имени флаг FL становится равным TRUE и цикл ввода имени файла прекращается.  После этого начинается непосредственно цикл ввода данных с клавиатуры из файла INPUT . Признак  конца ввода Ctrl+Z. Стандартное имя файла ввода с клавиатуры INPUT можно опустить и в операторе чтения из файла readln, и в функции проверки конца ввода eof. После создания файла и ввода всех данных файл закрывается процедурой close. Затем созданный файл открывается для чтения,  данные из него читаются и выводятся на экран в виде таблицы.

Файл может расширяться путем включения последующих элементов за последним существующим элементом файла. Для этого используется процедура позиционирования:

 

                   SEEK(<имя файла>, FILESIZE(<имя файла>))

на последний элемент файла.

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

 

type tz=record

     fio:string[10];

     tn:integer;

     zp:real

end;

var  zap:tz;

        fout:file of tz;

        tn1,tn2,n:integer;

        s:real;

        name:string;

begin

        writeln('имя файла ');

        readln(name);

                  assign (fout,name);

                  reset(fout);

                  s:=0;

        repeat

    readln(tn2);

    tn1:=tn2-101;        {формирование указателя записи}

     seek(fout,tn1);

     read(fout,zap);

     s:=s+zap.zp;

                  until eof;

                  writeln(‘s= ‘,s);

                  close(fout)

          end.

 

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

  

наверх

6.4 Особенности обработки текстовых файлов.

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

К текстовым файлам возможен только последовательный доступ. С текстовыми файлами работают различные редакторы текстов. Текстовые файлы имеют стандартный  тип TEXT.

 

                             VAR < имя файла>: TEXT;

 

Посимвольные операции ввода-вывода выполняются для текстовых файлов процедурами read и write. Строки обрабатываются специальными процедурами для текстовых файлов readln и writeln. Кроме того для текстовых файлов применяются процедуры ASSIGN,  RESET,  REWRITE,  CLOSE,  EOF,  eoln.  Процедура  append открывает существующий текстовый файл для добавления записей. Для текстовых файлов нельзя использовать процедуры и функции SEEK, FILEPOS, FILESIZE, т.к. элементы имеют разную длину.

input и output стандартные текстовые файлы для ввода с клавиатуры и вывода на экран.

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

 

          VAR F1,F2: TEXT;

                     POLE:STRING;

                     NAME:STRING[12];

                     PZ: INTEGER;

          BEGIN   WRITE(‘ВВОД ИМЕНИ ВХОДНОГО ФАЙЛА:’);

                        READLN(NAME);

                         ASSIGN(F1,NAME);

                       WRITE(‘ВВОД ИМЕНИ ВЫХОДНОГО ФАЙЛА:’);

                         READLN(NAME);

                         ASSIGN(F2,NAME);

                         RESET(F1);  REWRITE(F2);

                         WHILE NOT EOF(F1) DO

                        BEGIN

                                 READLN(F1,POLE);

                                 WHILE POS(‘ДС-101’, POLE) <> 0 DO

                                BEGIN

                                         PZ:= POS(‘ДС-101’, POLE);

                                         DELETE(POLE,PZ+3,1);

                                         INSERT(‘2’,POLE,PZ+3);

                                  END;

                                WRITELN(F2,POLE)

           END;

           CLOSE(F1);

           CLOSE(F2);

         END.

 

Здесь читаются последовательно строки из входного файла и в каждой строке в номере группы заменяется символ 1 на 2. Скорректированные строки выводятся в новый файл.

  

наверх

6.5 Файлы без типа.

 Любой файл может быть представлен в виде последовательности символов кода ASCII. Турбо Паскаль позволяет рассматривать файл с любой организацией как бы состоящим из блоков по 128 байт.

Файлы без типа используются обычно при копировании файлов, когда не важна внутренняя структура записи файла. Если длина сегмента на диске 1024 байта, то количество блоков в группе равно 8 при длине блока 128 символов.

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

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

 

          BLOCKREAD(<имя файла>,<переменная>,<число компонент>

                                                   [,<факт.число>]);

 

- для чтения блока из файла.

 

BLOCKwrite(<имя файла>,<переменная>,<число компонент>  

                                         [,<факт.число>]);

 

- для записи блока в файл.

Здесь:

<имя файла> - имя файла без типа;

<переменная>- имя переменной для чтения или записи;

<число компонент> - количество передаваемых компонент за один раз;

<фактическое число> - количество фактически переданных записей длиной 128 байт.

Файл для блочного ввода-вывода описывается с типом FILE. Для файла без типа нельзя использовать процедуры READ и WRITE.

 

                   VAR < имя файла> : FILE;

 

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

Рассмотрим пример блочного ввода-вывода. Пусть требуется скопировать данные из файла FromF в файл ToF.

 

var

FromF, ToF: file;

NR, NWr: Word;

NAME:STRING[12];

Buf: array[1..2048] of Char;

begin

          WRITE(‘ИМЯ ВХ.ФАЙЛА’);  

READLN(NAME);

ASSIGN(FROMF, NAME);

WRITE(‘ИМЯ ВЫХ.ФАЙЛА ’);

READLN(NAME);

ssign(ToF,NAME); 

Reset(FromF, 1);

Rewrite(ToF, 1);

repeat

        BlockRead(FromF, Buf, SizeOf(Buf), NR);

        BlockWrite(ToF, Buf, NR, NWr);

until (NR = 0) or (NWr <> NR);

Close(FromF);

Close(ToF);

end.

 

В примере программы при открытии файла без типа в вызове процедуры RESET указана длина записи равная 1. В этом случае при копировании файла не будут записаны лишние символы в новый файл.

 

наверх

 

к следующей главе

 

Hosted by uCoz