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
¦ 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
¦ ¦ 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;
¦ { Запись файла А в файл B }
¦ assign(B,'B');reset(A; rewrite(B);
¦ begin read(A,I); write(B,I); end;
¦ { Добавление новых элементов в файл B }
¦ for I:=1 to n do
¦ J:= random(10)-5; write(B,J);
¦ { Запись файла B в файл A }
¦ rewrite(A); reset(B);
¦ while not eof(B) do
¦ begin read(B,I); write(A,I); end;
Среди всех файлов особое место занимают текстовые файлы. Особенностью текстовых файлов является объединение в них символов в строки. Каждая строка кончается специальным символом конца строки. Этот специальный символ (литера) не входит в стандартный тип 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
¦ if eoln(BOOK) then K:=K+1; read(BOOK,S); write(S);
¦ writeln('В текстовом файле BOOK ', K,' - строк');
ПОЯСНЕНИЕ. В программе сначала формируется текстовый файл, у которого строки кончаются символом "$", а сам текст - символом ".". Текст вводится с клавиатуры в виде непрерывной цепочки, например:
Наша Маша громко плачет,Уронила в речку мячик.$Тише, Машенька, не плачь,$Не утонет в речке мяч.$.
Во второй части программы с помощью функции EOLN подсчитывается число строк текста и он выводится на экран построчно, т.е. в виде:
Наша Маша громко плачет,
Уронила в речку мячик.
Тише, Машенька, не плачь,
Не утонет в речке мяч.
Итак, для записи литеры "конец строки" используется процедура WRITELN(F), где F находится в режиме записи.
T
a
g
…
c
d
^
окно
WRITELN(T):
#
Таким образом сформированный файл легко выводится на печать построчно с помощью оператора WRITE, т.к. признак конца строки в файле иницирует переход на другую строку экрана (эффект оператора WRITELN).
В режиме чтения для работы с литерой "конец строки" есть процедура READLN. По этой процедуре окно файла устанавливается на первый элемент следующей строки файла.
b
e
f
READLN(T):
ПРИМЕР 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
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;
SYMBOLNOMB:=0; reset(CHARFILE);
while not eof(CHARFILE) do
read(CHARFILE, SYMBOL);
if SYMBOL in ['.',',',' ',':','...] then
SYMBOLNOMB:= SYMBOLNOMB + 1
PUNCTUATIОN:= SYMBOLNOMB
С помощью этой функции можно теперь произвести подсчет числа вхождений знаков препинания в любой текст, представленный некоторым текстовым файлом. Рассмотрим в качестве примера фрагмент программ для файла с именем FIL:
assign(FIL,'FIL');
reset(FIL);
n:=PUNCTUATION(FIL);
close(FIL);
writeln('число знаков препинания в тексте FIL =', n).
До сих пор мы рассматривали только так называемые статические программные объекты, т.е. объекты, порожденные в процессе компиляции программы и существующие в течение всего времени ее выполнения, размеры которых (объем машинной памяти для их размещения)не изменяются. Статические объекты определяются с помощью соответствующих описаний в разделе объявлений Паскаль-программ.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39