78193

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

Лекция

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

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

Русский

2015-02-07

109.5 KB

1 чел.

екция: Типы файлов. Организация файловой системы. Текстовые файлы. Нетипизированные файлы  с. 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


 

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

50659. Исследование измерительных генераторов 102.5 KB
  При увеличении сопротивлений в узкополосной колебательной системе частота настройки генератора плавно уменьшается. При увеличении емкостей в узкополосной колебательной системе частота настройки генератора плавно уменьшается. Измерение нагрузочной способности генератора. При работе генератора на малую нагрузку заметно существенное падение уровня выходного напряжения.
50660. Исследование режимов работы транзисторного усилителя мощности 876.5 KB
  Цель работы Освоение методики энергетического расчета режима транзисторного усилителя мощности. Ознакомление со схемой усилителя мощности назначением отдельных элементов и выбором их величин. Изучение особенностей форм импульсов тока транзисторного усилителя при работе на повышенных частотах.
50661. Метод граничных испытаний на надежность элементов и устройств ИИС 84.5 KB
  Исходные данные Модель исследуемой системы: Максимальная стоимость дополнительных затрат Cmx = 25 у. Практическая часть График рабочей области РО и области безотказной работы ОБР для системы с исходными данными представлен на рис. 1 рабочая область и область безотказной работы для системы с исходными данными Графически вероятность безотказной работы можно вычислить как...
50662. Измерение шумов и помех в телекоммуникационных системах 124 KB
  На выходе блока питания. На выходе блока усилителя. На выходе псофометра. Среднеквадратичное значение на выходе псофометра.
50663. Исследование цепей согласования выходного усилителя мощности 816 KB
  Цель работы Освоение методики расчета и настройки по приборам цепей согласования усилителя мощности УМ. Схема принципиальная электрическая Расчет колебательной системы Экспериментальная часть 3 6 9 12 15 18 21 24 27 17 16. При определенном значении достигают максимального значения которое соответствует критическому режиму работы транзистора. При настройке в резонанс достигается минимальное значение и максимальные значения и .
50664. Метод последовательного анализа при испытании на надежность 86.5 KB
  В качестве результатов испытаний приведены статистика отказов и графики зависимости отказов от времени: 1я реализация № отказа Время отказа 1 305 2 683 ИСПЫТАНИЕ ЗАВЕРШЕНО Граница браковки: 52. 1 Зависимость числа отказов от времени для 1 реализации 2я реализация № отказа Время отказа 1 311 2 377 3 693 ИСПЫТАНИЕ ЗАВЕРШЕНО Граница браковки: 52. 2 ...
50665. Релігія в світовому культурно-історичному просторі 103.5 KB
  Світові релігії в культурно-історичному просторі. Естетичні канони й етична програма буддизму. Етико-естетичні концепції християнства. Естетичний вимір Корану як священної книги ісламу. Особливості мусульманського мистецтва...
50666. Частотные модуляторы 195 KB
  Схема принципиальная электрическая ЧМ автогенератора с варикапом Схема принципиальная электрическая ЧМ автогенератора с реактивным транзистором Расчет Экспериментальная часть Выводы В ходе лабораторной работы были исследованы частотно-модулированные колебания в ЧМ автогенераторе с варикапом и реактивным транзистором. В схеме с варикапом видно что: Уходит значение центральной частоты.
50667. Исследование компенсационных стабилизаторов напряжения 831 KB
  Входное напряжение при номинальном рабочем режиме схемы: Выходное напряжение при номинальном рабочем режиме схемы: Увеличенное входное напряжение: Выходное напряжение при увеличенном входном напряжении: Измерение выходного сопротивления Выходное напряжение стабилизатора с нагрузкой...