У вас вопросы?
У нас ответы:) SamZan.net

У файла имеется имя что дает возможность программе работать одновременно с несколькими файлами

Работа добавлена на сайт samzan.net: 2015-07-05

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 6.4.2025

13

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

Файловые типы были введены в Турбо Паскаль для работы с внешними устройствами – файлами на диске, портами, принтером и т.д.

Любой файл имеет три характерные особенности:

- У файла имеется имя, что дает возможность программе работать одновременно с несколькими файлами.

- Файл содержит компоненты одного типа. Типом компонентов может быть любой тип Турбо-Паскаля кроме файлов, т.е. нельзя создать файл файлов.

- Длина вновь создаваемого файла не оговаривается при его открытии.

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

  •  типизированный;
  •  текстовый;
  •  нетипизированный.

Файловый тип можно задать одним из трех способов:

<имя> = FILE of <тип>

<имя> = TEXT

<имя> = FILE

Первое описание соответствует типизированному файлу, у которого каждый компонент имеет одинаковый оговоренный тип. Второе описание соответствует текстовому файлу. Третье описание соответствует нетипизированному файлу.

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

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

PRIMER.PAS– имя файла в текущем каталоге;

A:\PRIMER.PAS – полное имя файла;

CON’,’COM1’,’PRN – имена внешних устройств.

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

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

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

Используемую файловую переменную следует описать в разделе описания переменных VAR: 

TYPE

 XX=RECORD

      NAME:STRING;

      OC:BYTE

    END;

 F=FILE OF STRING;

VAR

 F1:F;

 F2:FILE OF BYTE;

 F3:FILE OF XX;

 F4:FILE;

 F5:TEXT;

Файлы F1, F2, F3 – типизированные, F4 – нетипизированный, F5 – текстовый.

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

ASSIGN(<файловая переменная>,<имя файла>)

Пример 1:

TYPE

 F=FILE OF STRING;

VAR

 F1:FILE OF BYTE;

 F2:F;

 T:STRING;

BEGIN

 ASSIGN(F1,’C:\232\OCENKA’);

 T:=’A:\FAM.TXT’;

 ASSIGN(F2,T);

  . . .

END.

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

Следующее, что необходимо сделать – это указать направление передачи информации – чтение из файла или запись в файл.

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

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

{$I-}

PROGRAM PRIMER;

. . .

Процедура RESET открывает типизированный файл не только для чтения, но и для записи в него новой информации. Но текстовый файл открывается процедурой RESET только для чтения.

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

Открыть текстовый файл для добавления в него новой информации  можно с помощью процедуры APPEND(<файловая переменная>). При этом указатель устанавливается в конец файла. Эту процедуру нельзя использовать с типизированными или нетипизированными файлами.

Чтобы изменить значение какого-то компонента типизированного файла необходимо открыть его с помощью процедуры RESET, и затем перевести указатель на нужный компонент с помощью процедуры SEEK(<файловая переменная>,N), где N – номер компонента файла (первый компонент имеет номер 0).

При этом может использоваться функция FILESIZE(<файловая переменная>), имеющая тип LONGINT, определяющая размер файла (число компонентов).

Функция EOF(<файловая переменная>) имеющая тип BOOLEAN возвращает TRUE, если указатель расположен в конце файла и FALSE в других случаях.

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

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

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

Пример 2:

VAR

 F:FILE OF BYTE;

 A,B:BYTE;

BEGIN

 ASSIGN(F,’A:\S.TXT’);

 REWRITE(F);

 A:=15;

 B:=125;

 WRITE(A,B);

 WRITE(F,A,B);

 CLOSE(F);

END.

В этом примере процедура WRITE(A,B) выведет содержимое переменных А и В на экран, а процедура WRITE(F,A,B) запишет значение переменной А в первый компонент (с номером 0) файла F  и значение переменной В во второй компонент (с номером 1) файла F.

После выполнения процедуры CLOSE(F) на диске A будет создан файл S.TXT размером в 2 байта.

Следует внимательно подходить к файлу, компонентами которого являются строки. Рассмотрим следующий пример:

Пример 3:

VAR

 F1:FILE OF STRING;

 F2:FILE OF STRING[10];

 S1:STRING;

 S2:STRING[10];

BEGIN

 ASSIGN(F1,’C:\232\A1.TXT’);

 ASSIGN(F2,’A2.TXT’);

 REWRITE(F1);

 REWRITE(F2);

 S1:=’ABCD’;

 S2:=’ABCD’;

 WRITE(F1,S1);

 WRITE(F2,S2);

 CLOSE(F1);

 CLOSE(F2);

END.

В этом примере оператор WRITE(F2,S2) является ошибочным. Дело в том, что в файл можно писать значения переменных, имеющих такой же тип, что и файл, при условии, что он является стандартным или ранее объявленным типом. В нашем примере тип STRING является стандартным и оператор WRITE(F1,S1) является правильным. Но тип STRING[10] является нестандартным и должен быть описан ранее в разделе описания типов TYPE. Правильный вариант предыдущего примера приведен ниже:

Пример 4:

TYPE

 FF:STRING[10];

VAR

 F1:FILE OF STRING;

 F2:FILE OF FF;

 S1:STRING;

 S2:FF;

BEGIN

 ASSIGN(F1,’C:\232\A1.TXT’);

 ASSIGN(F2,’A2.TXT’);

 REWRITE(F1);

 REWRITE(F2);

 S1:=’ABCD’;

 S2:=’ABCD’;

 WRITE(F1,S1);

 WRITE(F2,S2);

 CLOSE(F1);

 CLOSE(F2);

END.

Следует иметь в виду, что хотя в файлы F1 и F2 была записана одинаковая информация, длина файла F1 составит 256 байтов, а длина файла F2 – 11 байтов. Ошибочными будут также операторы WRITE(F1,S2) и WRITE(F2,S1) из-за несоответствия типов файла и записываемой переменной.

Для чтения информации из типизированных файлов применяют процедуру

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

Пример 5:

TYPE

 FF:STRING[10];

VAR

 F2:FILE OF FF;

 S2:FF;

BEGIN

 ASSIGN(F2,’A2.TXT’);

 RESET(F2);

 REPEAT

   READ(F2,S2);

   WRITELN(S2);

 UNTIL EOF(F2);

 CLOSE(F2);

END.

или

Пример 6:

TYPE

 FF:STRING[10];

VAR

 F2:FILE OF FF;

 S2:FF;

 K:INTEGER;

BEGIN

 ASSIGN(F2,’A2.TXT’);

 RESET(F2);

 FOR K:=1 TO FILESIZE(F2) DO

 BEGIN

   READ(F2,S2);

   WRITELN(S2);

 END;

 CLOSE(F2);

END.

Текстовые файлы предназначены для хранения текстовой информации, но записать в них можно и числовые данные. В этом случае при записи происходит автоматическое преобразование числовой информации в символьную. Но при этом записанные компоненты имеют разную длину, что существенно влияет на работу с ним. В отличие от типизированного файла прочитать текстовый файл можно только последовательно, начиная с самого начала.  При создании текстового файла в конце каждой строки ставится признак конца строки EOLN (последовательность символов с ASCII кодами 13 и 10), а в конце файла – признак конца файла EOF (символ с ASCII кодом 26). Эти признаки можно протестировать одноименными функциями EOLN и EOF.

Запись в текстовый файл похожа на запись в типизированный файл и осуществляется процедурами WRITE и WRITELN.

Пример 7:

PROGRAM FILE_TEXT_WRITE;

VAR

 X:REAL;

 K:BYTE;

 S:STRING;

 F:TEXT;

 C:CHAR;

 B:BOOLEAN;

BEGIN

 K:=25;

 B:=TRUE;

 X:=-1.35;

 S:='PRIMER';

 ASSIGN(F,'PRIMER1.TXT');

 REWRITE(F);

 WRITE(F,K,X,S,B);

 WRITELN(F,K,'7');

 WRITELN(F);

 WRITE(F,3);

 CLOSE(F);

  END.

 В результате будет создан текстовый файл PRIMER1.TXT, в котором в первой строке будет записано:

Вторая строка будет пропущена, а в третьей записан один символ 3.

 Просмотреть содержимое этого файла можно с помощью любого текстового редактора: редактора Блокнот, редактора FAR MENAGER и других.

Прочитать содержимое этого файла можно с помощью процедур READ или READLN. Чтение содержимого текстового файла можно прочитать в переменные символьного или строкового типа. Если для чтения использовать переменную символьного типа, то лучше воспользоваться процедурой READ:

Пример 8:

PROGRAM FILE_TEXT_READ;

VAR

 F:TEXT;

 C:CHAR;

BEGIN

 ASSIGN(F,'PRIMER1.TXT');

 RESET(F);

 REPEAT

   READ(F,C);

   WRITE(C);

 UNTIL EOF(F);

 CLOSE(F);

  END.

Процедура READ(F,C) читает по одному символу (в том числе и символы конца строки), а процедура WRITE(C) выводит все эти символы на экран.

Можно было прочитать этот файл и в переменную типа STRING, но при этом функция READ сможет прочитать только одну строку и для правильного чтения следует использовать процедуру READLN:

Пример 9:

PROGRAM FILE_TEXT_READ;

VAR

 F:TEXT;

 S:STRING;

BEGIN

 ASSIGN(F,'PRIMER1.TXT');

 RESET(F);

 REPEAT

   READLN(F,S);

   WRITELN(S);

 UNTIL EOF(F);

 CLOSE(F);

  END.

Процедура READLN(F,S) прочитает все символы текущей строки до символов конца строки с кодами 13 и 10 (сами эти символы прочитаны не будут), а процедура WRITELN(S) выведет ее на экран. Если переменная S будет описана, например как S:STRING[10], то прочитаются только начальные части строк из десяти символов. В частности в первой строке прочитаются только символы:

 25-1.35000

Если бы для вывода использовалась процедура WRITE(S), то весь текст файла вывелся бы в одну строку, в то время как в предыдущем примере, когда для чтения из файла использовалась процедура READ процедура WRITE вывела текст правильно в тех строках. Это объясняется тем, что процедура READ читает символы конца строк, которые затем управляют переводом строк при выводе, а процедура READLN пропускает символы конца строк и управлять переводом вывода текста на новую строку приходиться с помощью процедуры WRITELN.

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

Так, если в примере 7 вместо оператора 

WRITE(F,K,X,S,B)

вставить оператор  

WRITE(F,K,’ ‘,X,S,B)

то программу чтения созданного файла можно записать в следующем виде:

Пример 10:

PROGRAM FILE_TEXT_READ;

VAR

 F:TEXT;

 C:CHAR;

 K:BYTE;

BEGIN

 ASSIGN(F,'PRIMER1.TXT');

 RESET(F);

 READ(F,K);

 WRITE(K);

 REPEAT

   READ(F,C);

   WRITE(C);

 UNTIL EOF(F);

 CLOSE(F);

  END.

В этом случае первые два символа 25 преобразуются в  целое значение, которое присваивается переменной K, а все остальные символы последовательно читаются в символьную переменную С, как и в примере 8.




1.  ПРЕДПОСЫЛКИ ПОСТАНОВКИ ПРОБЛЕМЫ
2. .Теорема Остроградского Гаусса для электростатического поля в среде 1
3. Понятие и длительность производственного цикла 2
4. Красное Село от 12
5.  Теоретические и методические аспекты форме фонда заработной платы7 1
6. Красные лучше учли этот фактор предложив федералистские принципы построения единого государства и провоз.html
7. Гомельский государственный дорожно строительный колледж имени Ленинского комсомола Белоруссии Э
8.  150 гр. Украшение- Морковь желтки и белки яичные маслины зелёные и тёмные
9. Лекция 5 Основы защиты информации
10. Финансовый учет для подготовки к промежуточной аттестации 1