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

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

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
13
Работа с файлами
Файловые типы были введены в Турбо Паскаль для работы с внешними устройствами файлами на диске, портами, принтером и т.д.
Любой файл имеет три характерные особенности:
- У файла имеется имя, что дает возможность программе работать одновременно с несколькими файлами.
- Файл содержит компоненты одного типа. Типом компонентов может быть любой тип Турбо-Паскаля кроме файлов, т.е. нельзя создать файл файлов.
- Длина вновь создаваемого файла не оговаривается при его открытии.
В зависимости от способа объявления в Турбо Паскале можно выделить три типа файлов:
Файловый тип можно задать одним из трех способов:
<имя> = FILE of <тип>
<имя> = TEXT
<имя> = FILE
Первое описание соответствует типизированному файлу, у которого каждый компонент имеет одинаковый оговоренный тип. Второе описание соответствует текстовому файлу. Третье описание соответствует нетипизированному файлу.
Текстовые файлы предназначены для хранения информации в виде строк символов. При записи в текстовый файл данные преобразуются из внутренней формы представления в символьную. Типизированные и нетипизированные файлы хранят данные в том виде, в котором они представлены в оперативной памяти, т.е. при записи происходит побитовое копирование информации.
Чтобы не путать файлы в программе и файлы не диске, переменные файлового типа называют логическими файлами, а реальные устройства и файлы на диске физическими файлами. Их имена задаются с помощью строк символов, например:
PRIMER.PAS имя файла в текущем каталоге;
A:\PRIMER.PAS полное имя файла;
CON,COM1,PRN имена внешних устройств.
Для работы с файлами необходимо выполнить следующие действия:
Все стандартные процедуры и функции Турбо Паскаля работают только с логическими файлами, т.е. с файловыми переменными.
Используемую файловую переменную следует описать в разделе описания переменных VAR:
TYPE
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;
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.
Вторая строка будет пропущена, а в третьей записан один символ 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
Прочитать содержимое текстового файла можно не только в переменные строкового или символьного типа. Если читаемые символы могут быть интерпретированы как число целого или вещественного типа, то можно прочитать их в переменные этого типа. При этом происходит автоматическое преобразование этих данных из символьного типа в соответствующий числовой тип. Но при этом справа и слева от этих символов должны быть разделители в виде пробелов или символов конца строк. В противном случае при чтении будет ошибка.
Так, если в примере 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.