10.4 Основные приемы работы с файлами
Известно существование многих версий Паскаля, каждая из которых имеет свои особенности и отличия от стандарта Паскаля. Рассмотрим некоторые приемы работы с файлами в системах Turbo-Pascal для ПЭВМ "Ямаха" и IBM PC.
Перед началом работы с файлами (до первого обращения к файлу) должна быть выполнена процедура ASSIGN. Эта процедура отождествляет имя файла с соответствующей файловой переменной.
СИНТАКСИС: assign(var F: file; NAME: string), где NAME - имя файла на диске, F - имя файловой переменной.
После выполнения этой процедуры NAME и F отождествляются, например, ASSIGN(F,'nomfile') отождествляет файловую переменную F с его именем на диске. В качестве имени файла может быть указаноего полное имя, т.е. путь к этому файлу, например:
ASSIGN(F,'С:\WORK\ MIM\nomfile').
После окончания работы с файлом он должен быть закрыт процедурой CLOSE, иначе результат может быть потерян, т.к. директория не будет обновлена.
СИНТАКСИС: CLOSE(var F:file), где F - имя файловой переменной.
Процедуры ASSIGN и CLOSE взаимосвязаны и работают в паре друг с другом. Как уже сказано выше, перед началом работы с файлом выполняется процедура ASSIGN(F, 'nomfile'), которая для логического файла F готовит (ищет) на диске в указанной директории файл с именем NOMFILE. При окончании работы с файлом по выполнению процедуры CLOSE происходит его обновление (в случае записи) и закрытие (в случае чтения).
В программе надо уметь задавать исходные файлы. Эти файлы надо делать в цикле, используя при этом формирование компонент, либо в форме некоторого выражения по RANDOMIZE, либо задействовать обычную команду READ для ввода данных с клавиатуры. Цикл можно делать FOR, если формирование файла идет по RANDOMIZE, или WHILE (REPEAT), если файл формируется по признаку конца ввода.
Напомним, что RANDOMIZE - процедура инициализации генератора случайных величин; RANDOM - функция генерации случайных чисел.
Рассмотрим все эти особенности на примере формирования, обработки и вывода файлов.
ПРИМЕР 2. Для двух целочисленных файлов F и G одинаковой длины образовать третий целочисленный файл H, компоненты которого определяются по правилу: Hi=MAX{Fi,Gi}. В программе предусмотреть вывод на экран все трех файлов
program MAXELEM;
type FT = file of integer;
var F,G,H: FT;
I,J: integer;
procedure VIVODFILE(var A:FT);
begin
¦ reset(A);
¦ while not eof(A) do
¦ begin
¦ read(A,I); write(I:4);
¦ end; writeln;
end;
begin { формирование исходных файлов }
¦ assign(F,'F'); assign(G,'G');
¦ randomize; rewrite(F); rewrite(G);
¦ for I:=1 to 10 do
¦ begin
¦ J:= random(10)-5; write(F,J);
¦ ¦ J:= random(10)-5; write(G,J);
¦ end;
¦ VIVODFILE(F); close(F);
¦ VIVODFILE(G); close(G);
¦ assign(H,'H');
¦ { формирование файла результата }
¦ reset(F); reset(G); rewrite(H);
¦ while not eof(F) do
¦ begin
¦ ¦ read(F,I); read(G,J);
¦ ¦ if I > J then write(H,I) else write(H,J);
¦ end; VIVODFILE(H);
¦ close(H);
end.
5. Файл в данный момент времени открыт либо для чтения, либо для записи. Поэтому для добавления к файлу новых элементов необходимо сначала переписать во вспомогательный файл исходный, затем добавить к нему новые элементы. При этих двух операциях вспомогательный файл открыт для чтения. После заполнения вспомогательного файла он переписывается в исходный, при этом начальные элементы исходного файла заносятся туда во второй раз. Все эти операции представлены в виде следующей процедуры:
procedure DOBAVLENIE(N: integer; var A:file);
var B: file; I,J: integer;
begin
¦ { Запись файла А в файл B }
¦ assign(B,'B');reset(A; rewrite(B);
¦ while not eof(A) do
¦ begin read(A,I); write(B,I); end;
¦ { Добавление новых элементов в файл B }
¦ for I:=1 to n do
¦ begin
¦ J:= random(10)-5; write(B,J);
¦ end;
¦ { Запись файла B в файл A }
¦ rewrite(A); reset(B);
¦ while not eof(B) do
¦ begin read(B,I); write(A,I); end;
end.
10.5 Текстовые файлы
Среди всех файлов особое место занимают текстовые файлы. Особенностью текстовых файлов является объединение в них символов в строки. Каждая строка кончается специальным символом конца строки. Этот специальный символ (литера) не входит в стандартный тип CHAR и не имеет графического представления. Нас и не интересует вид этого символа. Главное, что с ним связана логическая функция EOLN (конец строки). EOLN(F) = TRUE, если окно указывает на признак конца строки. Заметим, что если EOLN(F) = TRUE, то при чтении элементов из файла в символьную переменную она принимает значение пробела (пробел - аналог конца строки). Для записи в файл признака конца строки служит стандартная процедура WRITELN.
Текстовые файлы, т.е. файлы с делением на строки, описываются с помощью слова TEXT, например, VAR X, D: TEXT.
ПРИМЕР 3. Определить количество строк в файле с именем BOOK
program NOMBRELINE;
var K: integer; BOOK: text; S: char;
begin { Формирование файла BOOK }
¦ assign(BOOK,'f1'); rewrite(BOOK); read(S);
while S<> '.' do begin
¦ while S <> '#' do begin
¦ write(BOOK,S); read(S); end;
¦ writeln(book);read(S); end; close(BOOK);
¦ { Подсчет числа строк в текст; BOOK }
¦ K:= 0; reset(BOOK); writeln;
¦ while not eof(BOOK) do
¦ begin
¦ if eoln(BOOK) then K:=K+1; read(BOOK,S); write(S);
¦ end;
¦ writeln('В текстовом файле BOOK ', K,' - строк');
end.
ПОЯСНЕНИЕ. В программе сначала формируется текстовый файл, у которого строки кончаются символом "$", а сам текст – символом ".". Текст вводится с клавиатуры в виде непрерывной цепочки, например:
Наша Маша громко плачет,Уронила в речку мячик.$Тише, Машенька, не плачь,$Не утонет в речке мяч.$.
Во второй части программы с помощью функции EOLN подсчитывается число строк текста и он выводится на экран построчно, т.е. в виде:
Наша Маша громко плачет,
Уронила в речку мячик.
Тише, Машенька, не плачь,
Не утонет в речке мяч.
Итак, для записи литеры "конец строки" используется процедура WRITELN(F), где F находится в режиме записи.
T | a | g | … | c | d | ||
^ | |||||||
окно |
WRITELN(T):
T | a | g | … | c | d | # | |
^ | |||||||
окно |
Таким образом сформированный файл легко выводится на печать построчно с помощью оператора WRITE, т.к. признак конца строки в файле иницирует переход на другую строку экрана (эффект оператора WRITELN).
В режиме чтения для работы с литерой "конец строки" есть процедура READLN. По этой процедуре окно файла устанавливается на первый элемент следующей строки файла.
T | d | … | b | c | d | # | e | f | |
^ | |||||||||
окно |
READLN(T):
T | d | … | b | c | d | # | e | f | |
^ | |||||||||
окно |
ПРИМЕР 4. Дано некоторое стихотворение в виде текстового файла ACROSTIH. Напечатать слово, образованное первыми буквами строк стихотворения (акростих)
program SLOVO(ACROSTIH); program FORMFIL;
var L:char; T: text; var F: text; S: char;
begin begin
¦ assign(T,'ACROSTIH'); ¦ assign(F,'ACROSTIH');
reset(T); ¦ rewrite(F); read(S);
¦ while not eof(T) do ¦ while S <> '?' do
¦ ¦ begin
¦ begin ¦ while S <> '#' do
¦ ¦ begin
read(T,L); write(L); ¦ write(F,S); read(S);
¦ ¦ end;
¦ readln(T); ¦ writeln(F);read(S); end;
¦ end; ¦ close(F);
end. end.
ПОЯСНЕНИЕ. Программа FORMFIL формирует текстовый файл ACROSTIH как было показано в примере 3. В программе SLOVO файл ACROSTIH выступает как внешний. Ему соответствует файловая переменная T. Оператор READLN(T) последовательно устанавливает окно файла на начало строк текста.
Файлы, как переменные величины, могут выступать в качестве аргументов и результатов при создании функций-процедур, причем эти переменные должны быть всегда оформлены как параметры-переменные, даже если файл в процедуре играет роль аргумента.
ПРИМЕР 5. Посчитать число знаков препинания в указанном текстовом файле
function PUNCTUATION(var CHARFILE: text): integer;
var SYMBOLNOMB: integer;
SYMBOL: char;
begin
SYMBOLNOMB:=0; reset(CHARFILE);
while not eof(CHARFILE) do
begin
read(CHARFILE, SYMBOL);
if SYMBOL in ['.',',',' ',':','...] then
SYMBOLNOMB:= SYMBOLNOMB + 1
end;
PUNCTUATIОN:= SYMBOLNOMB
end.
С помощью этой функции можно теперь произвести подсчет числа вхождений знаков препинания в любой текст, представленный некоторым текстовым файлом. Рассмотрим в качестве примера фрагмент программ для файла с именем FIL:
assign(FIL,'FIL');
reset(FIL);
n:=PUNCTUATION(FIL);
close(FIL);
writeln('число знаков препинания в тексте FIL =', n).
... .....-46.780 Program Prim24; Var r1,r2:real; BEGIN r1:=-46.78; r2:=-46.78; writeln('r1=',r1:12:3,' r2=',r2:9:4); writeln('_______________________________'); readln; END. 6. Массивы 6. 1. Описание массивов В языке Паскаль можно обрабатывать не только отдельные переменные, но и их совокупности. Одной из таких совокупностей (структурированных) данных является массив. ...
... . Объясните, для чего служат разрешения и привилегии в Windows NT. Зав. кафедрой -------------------------------------------------- Экзаменационный билет по предмету СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ Билет № 22 Перечислите возможности и инструменты системы программирования Microsoft Developer Studio. Укажите для чего предназначается буфер в системах ввода-вывода, ...
... с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это пересылка данных из основной памяти на внешнее устройство (в выходной файл). Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах на языке Паскаль имена файлов задаются с помощью строк. Например, имя файла на диске может иметь вид: ...
0 комментариев