78193

Типы файлов. Организация файловой системы. Текстовые файлы. Нетипизированные файлы

Лекция

Информатика, кибернетика и программирование

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

Русский

2015-02-07

109.5 KB

0 чел.

екция: Типы файлов. Организация файловой системы. Текстовые файлы. Нетипизированные файлы  с. 8 из 8

Оглавление

[1] Оглавление

[2] Файлы. Файловые переменные

[2.1] Стандартные процедуры и функции обработки файлов

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

[2.3] Файлы без типа (нетипизированные файлы)

[2.4] Контрольные вопросы

[2.5] Задание

Урок-лекция №24

Файлы. Файловые переменные

Понятие «файл» обычно связывают с информацией на устройствах внешней памяти. В Паскале понятие файла употребляется в двух смыслах:

• как поименованная информация на внешнем устройстве (внешний файл);

• как переменная файлового типа в Паскаль-программе (внутренний файл).

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

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

Структура описания файловой переменной:

Var <имя переменной>: File Of <тип элемента>;

где <тип элемента> может быть любым, кроме файлового типа.

Например:

Var

Fi: File Of Integer;

Fr: File Of Real;

Fc: File Of Char; 

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

эл.0

эл. 1

…..

эл. N

м.к.

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

Для того чтобы начать запись в файл, его следует открыть для записи. Это обеспечивает процедура REWRITE (FV); где FV — имя файловой переменной. При этом указатель устанавливается на начало файла. Если в файле есть информация, то она исчезает. Схематически выполнение процедуры REWRITE можно представить так:

До:

эл.0

эл. 1

…..

эл. N

м.к.

REWRITE(FV,V);

После:

м.к.

       

Стрелка внизу отмечает позицию указателя.

Запись в файл осуществляется процедурой WRITE (FV, V); где V — переменная того же типа, что и файл FV. Запись происходит туда, где установлено окно (указатель). Сначала записывается значение, затем указатель смещается в следующую позицию. Если новый элемент вносится в конец файла, то сдвигается маркер конца. Схема выполнения оператора:

До:

эл.0

эл. 1

…..

эл. N

м.к.

         

WRITE(FV,V);

После:

эл.0

эл. 1

…..

эл. N

V

м.к.

          

Пример 1. В файловую переменную Fx занести 20 символов, последовательно вводимых с клавиатуры.

Var  Fx: File Of char;

X: char; I: Byte;

Begin

Assign(FX,’d:\1.dat’);

Rewrite(Fx);

For I:=1 To 20 Do

Begin

Write ('?'); ReadLn(X);

Write(Fx,X)

End;

Close(fx)

End.

Для чтения элементов файла с его начала следует открыть файл для чтения. Это делает процедура Reset (FV). В результате указатель устанавливается на начало файла. При этом вся информация в файле сохраняется. Схема выполнения процедуры:

До:  

эл.0

эл.1

…..

эл.N

м.к.

           

RESET(FV);

После:  

эл.0

эл.1

…..

эл.N

м.к.

 

Чтение из файла осуществляется процедурой READ (FV, V); где V — переменная того же типа, что и файл FV. Значение текущего элемента файла записывается в переменную v; указатель смещается к следующему элементу.

До:              

эл.0

эл.1

…..

эл.К

эл.К+1

….

эл.N

м.к.

     

READ(FV,V);

После:             

эл.0

эл.1

…..

эл.К

эл.К+1

….

эл.N

м.к.

       

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

Принцип последовательного доступа: для того чтобы прочитать n-ю запись файла, сначала нужно прочитать все предыдущие записи с 1-й по (n-1)-ю.

Пример 2. В переменной х получить 10-й элемент символьного файла Fx.

Program A;

Var Fx: File Of char;

X: char;

Begin

 ….

Reset(Fx);

For I:=l To 10 Do Read(Fx,X)

.

End.

Функция Eof (FV) проверяет маркер конца файла (end of file). Это логическая функция, которая получает значение true, если указатель установлен на маркер конца, в противном случае — false.

Пример 3. Просуммировать все числа из файла целых чисел Fx.

…..

Reset(Fx);

Sx:=0;

While Not Eof(Fx) Do 

Begin 

Read(Fx,X);

Sx:=Sx+X 

End;

……

To же самое с помощью цикла Repeat можно делать следующим образом:

Repeat

Read(Fx,X);

Sx:=Sx+X

Until Eof(Fx);

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

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

Стандартные имена логических устройств определяются операционной системой, в среде которой работает Паскаль. В системе MS DOS определены следующие имена:

CON (консоль) — логическое устройство, связанное при вводе с клавиатурой, при выводе — с экраном;

PRN (принтер) — логическое имя файла, связанного с устройством печати;

AUX — логическое имя коммуникационного канала, который используется для связи ПК с другими машинами;

INPUT — логическое имя стандартного устройства ввода, связанного с клавиатурой; при этом вводимые с клавиатуры символы отражаются на экране дисплея;

OUTPUT — логическое имя стандартного устройства вывода а экран.

Для организации связи между файловой переменной и внешним файлом в Турбо Паскале используется процедура назначения Assign.

Стандартные процедуры и функции обработки файлов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

S1

S2

Sk1

к.с.

S1

S2

Sk2

к.с.

к.ф.

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

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

Формат описания

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

Посимвольные  операции  ввода-вывода  выполняются  для  текстовых  файлов  процедурами  READ  и WRITE. Строки  обрабатываются специальными  процедурами  для  текстовых  файлов  READLN  и WRITELN. Кроме того, для текстовых файлов применяются процедуры ASSIGN,  RESET,  REWRITE,  CLOSE,  EOF,  EOLN.  APPEND (<имя файла>); – процедура открывает существующий текстовый файл для добавления записей.

Для текстовых файлов нельзя использовать процедуры и функции SEEK, FILEPOS, FILESIZE, т.к. элементы имеют разную длину.

INPUT и OUTPUT – стандартные текстовые файлы для ввода с клавиатуры и вывода на экран.

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

Для считывания информации из текстового файла используются процедуры: Read и Readln. Их формат следующий:

 READ (< имя >, <пер1>[,<пер2>,.., <перN>]);

READLN (< имя >, <пер1>[,<пер2>,.., <перN >]);

Здесь < имя > - файловая переменная, а <пер1>,<пер2>,.., <перN > - переменные типа String, в которые должна считываться информация.

Процедура READ считывает строку из файла без перехода на следующую строку в переменную, а READLNс переводом строки.

Для записи информации в файл используются процедуры WRITE и WRITELN. Их формат такой же, что и у процедур READ и READLN.

 EOLN(<имя файла>):Boolean; - функция обнаружения конца строки.

Пример 4. Дан текстовый файл F1.Необходимо заменить во всех записях этого файла код группы DC-101 на DC-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(‘DC-101’, POLE) <> 0 DO

        BEGIN

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

         DELETE(POLE,PZ+3,1);

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

        END;

      WRITELN(F2,POLE)

    END;

  CLOSE(F1);

  CLOSE(F2);

END.

 

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

Пример 5. Пусть файл с именем Note. txt содержит некоторый текст. Требуется подсчитать количество строк в этом тексте.

Var Note: Text; К: Integer;

Begin Assign(Note,'Note.txt') ;

Reset(Note);

K:=0;

While Not Eof (Note) Do

Begin

ReadLn(Note); K:=K+1

End;

WriteLn('Количество строк равно',К);

Close(Note)

End.

Используемый здесь оператор ReadLn (Note) «пролистывает» строки из текстового файла Note, не занося их в какую-либо переменную.

Пример 6. В текстовом файле Note. txt определить длину самой большой строки.

Var Note: Text;

Мах,К: Integer; С: Char;

Begin

Assign(Note,'Note.txt');

Reset(Note);

Max:=0;

While Not Eof(Note) Do

Begin

K:=0;

While Not Eoln(Note) Do

Begin

Read(Note,С); K:=K+1

End;

If K>Max Then Max:=K;

ReadLn(Note)

End;

WriteLn('Наибольшая строка имеет', Max,'знаков');

Close(Note)

End.

Здесь каждая строчка прочитывается посимвольно, при этом в переменной К работает счетчик числа символов в строке. В переменной Мах отбирается наибольшее значение счетчика.

Файлы без типа (нетипизированные файлы) 

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

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

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

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

Формат описания

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

 

BLOCKREAD(<имя файла>,<переменная>,<число компонент> [,<факт.число>]); –  для чтения блока из файла.

BLOCKWRITE(<имя файла>,<переменная>,<число компонент> [,<факт.число>]); – для записи блока в файл.

Здесь <имя файла> – имя файла без типа;  <переменная> – имя переменной для чтения или записи;  <число компонент> – количество передаваемых компонент за один раз; <фактическое число> – количество фактически переданных записей длиной 128 байт.

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

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

Пример 7. Копирование данных из файла 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);

ASSIGN(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. В этом случае при копировании файла не будут записаны лишние символы в новый файл.

Пример 8.  Допустим имеем такой файл: dЦHello! Здесь: d - ASCII 100,   Ц - ASCII 150 ,  Hello! - строка из 6-ти символов. Организовать чтение из файла с выводом на экран.  

type R = record

 A: Byte;

 C: Array[1..6] of Char; end;

var F: File; I: Byte; Rec: R; Result: Word;

begin

Assign(F, '1.txt'); { связываем файл с переменной}

{$I-}

Reset(F, 1);

{$I+}

if IOResult<>0 then Halt;

BlockRead(F, I, Sizeof(I), Result);

BlockRead(F, Rec, Sizeof(Rec), Result); Writeln(I);

Writeln('Rec values: '); Writeln('A: ', Rec.A); Writeln('S: ', Rec.C);

Readln; Close(F);

end.

В примере функция SIZEOF принимает в качестве параметра любую переменную и возвращает ее размер в байтах. Размер переменных стандартных типов (Integer, Byte....) можно найти в таблицах типов. Поэтому SIZEOF иногда очень выручает, упрощая работу. Дополнительный параметр процедуры RESULT указывает размер буфера, который используется для передачи данных. Буфер по умолчанию равен 128 байт. Если его явно не указывать, то Паскаль устанавливает это значение.

Пример 9.  Сформировать данные для записи в файл.

uses Crt;

type R = record

A: Integer;

B: Word; end;

var  F: File;

Result: Word;

C: Char;

I: Integer;

S: String;

Rec: R;

begin 

ClrScr;

{ считываем и задаем исходные данные }

Write('Enter CHAR: '); Readln(C);

Write('Enter INTEGER: '); Readln(I);

Write('Enter STRING: '); Readln(S);

Randomize;

Rec.A := Random(1000); Rec.B := Random(1000);

Writeln('Rec.A: ', Rec.A);

Writeln('Rec.B: ', Rec.B);

Readln;

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

Assign(F, '1.txt');

ReWrite(F, 1);

BlockWrite(F, C, SizeOf(C)+SizeOf(I)+255+SizeOf(Rec), Result);

Close(F);

end.

В процедуре BLOCKWRITE использовалось целое выражение в качестве указания размера записываемого буфера. Составлено оно из суммы 3х результатов функции SIZEOF и числа 255, которое является длиной строки S.

Пример11. Использование псевдографики. Это обычные символы, которые имеются в стандартном наборе ASCII.

Program Border;

uses Crt;

Procedure MakeWindow(X, Y, X1, Y1: Byte);

Var I: Byte;

Begin

GotoXY(X, Y); Write(#201); GotoXY(X1, Y); Write(#187);

GotoXY(X, Y1); Write(#200);  GotoXY(X1, Y1); Write(#188);

For I := X+1 to X1-1 do

Begin GotoXY(I, Y); Write(#205);GotoXY(I, Y1); Write(#205); end;

For I := Y+1 to Y1-1 do

Begin GotoXY(X, I); Write(#186); GotoXY(X1, I); Write(#186); end;

end;

var B: Byte;

Begin

ClrScr;

B := 187;

Writeln('201: ', #201); { вывод символа по его коду }

Writeln('205: ', chr(205));{возвращает символ, номер которого в ASCII таблице задан параметром}

Writeln('187: ', chr(B)); { }

Write('186: ', #186, #13, #10);{ вывод символов #13 (перенос строки) и #10 (возврат каретки) }

Write('188: ', #188); {}  

Write(#$0d,#$0a,'200: ',#200);{символы с №, который задан числом в 16-й системе: $0d - 13, $0a - 10} 

MakeWindow(10, 10, 40, 20);{ построение окошек по заданным координатам }  

Readln;

end.

Контрольные вопросы

  1.  Дать определение понятию файловой переменной.
  2.  Стандартные процедуры и функции обработки данных файла.
  3.  Формат файловой переменной для текстовых файлов. Перечислить процедуры и функции для работы с текстовыми файлами.
  4.  Формат файловой переменной для нетипизированных файлов. Перечислить процедуры и функции для работы с файлами без типа.

Задание

  1.  Создайте процедуру создания окна с заголовком: наподобие тех, которые использует сам Turbo Pascal. Естественно, без служебных символов и областей, просто заголовок, расположенный посередине.
  2.  Создайте программу "Записная книжка", с возможностью сохранения информации в файл.

PAGE  1


 

А также другие работы, которые могут Вас заинтересовать

55749. «Ромео і Джульєтт». Вистава за трагедією Вільяма Шекспіра мовою оригіналу (театралізоване свято) 56 KB
  When William married, he was still a teenager. r He had three children, but in 1587 he went to London. There he began to act and to write plays. Shakespeare became a veiy important member of a well- known acting company.
55751. Использование технологии «Развитие критического мышления через чтение и письмо» на уpокаx pусского языка 72.5 KB
  Переложенные на язык практики идеи технологии ЧПКМ выглядят следующим образом: дети от природы любознательны они хотят познавать мир способны рассматривать серьёзные вопросы и выдвигать оригинальные идеи...
55753. Рослини – символи України 72.5 KB
  Мета: Розширювати знання дітей про рослини – символи України; формувати вміння повноцінно сприймати художні й науково-пізнавальні тексти; розвивати мовленнєві вміння, брати участь у колективному обговоренні питання...
55754. РОСЛИНИ ЛІСУ. В. СУХОМЛИНСЬКИЙ «ХЛОПЧИК ТА ДЗВІНОЧОК КОНВАЛІЇ» 62.5 KB
  Мета: сприяти цілісності процесу навчання; формувати уявлення про різноманітність природи України; закріплювати вміння читати свідомо та виразно; формувати вміння правильно інтонувати речення під час читання...
55755. День народження музею кімнатних рослин 132.5 KB
  Розробка позакласного заходу на заявлену тему мета якого формування в учнів нової екологічної культури; розвиток креативного мислення; дослідити яке значення мають квіти в житті людини...
55756. Генеративні органи квіткових рослин 68.5 KB
  Мета: повторити, закріпити, узагальнити й систематизувати знання, про генеративні органи, які забезпечують розмноження квіткових рослин;розвивати практичні навички роботи з наочністю...