Пример 5. Определить среднюю температуру для значений, хранящихся в файле Temp.dat.
Program Task2;
Var Ft: File Of Real;
T,St: Real; N: Integer;
Begin Assign(Ft,'Temp.dat');
Reset(Ft);
St:=0;
While Not Eof(Ft) Do
Begin
Read(Ft,T);
St:=St+T
End;
N:=FileSize(Ft);
St:=St/N;
WriteLn('Средняя температура зa',N:3,'суток равна',St:7:2,'гр-в');
Close(Ft)
End.
В этой программе использована функция определения размера файла:
FileSize (<имя файловой переменной>);
Ее результат — целое число, равное текущей длине файла.
Замечание: согласно стандарту Паскаля в файл, открытый оператором Rewrite, можно только записывать информацию, а файл, открытый оператором Reset, можно использовать только для чтения. В Турбо Паскале допускается запись (Write) в файл, открытый для чтения (Reset). Это создает определенные удобства для модификации файлов.
Текстовые файлы. Текстовый файл — наиболее часто употребляемая разновидность файлов. Как уже отмечалось раньше, немагнитные внешние устройства (логические) работают только с текстовыми файлами. Файлы, содержащие тексты программ на Паскале и других языках программирования, являются текстовыми. Различная документация, информация, передаваемая по каналам электронной связи, — все это текстовые файлы.
В программе файловая переменная текстового типа описывается следующим образом:
Var <идентификатор>:tехt;
Текстовый файл представляет собой символьную последовательность, разделенную на строки
Каждая строка заканчивается специальным кодом — маркером конца строки (м.к.с.). Весь файл заканчивается маркером конца файла (м.к.ф.). Схематически это выглядит так:
Каждый символ представлен во внутреннем коде (ASCII) и занимает 1 байт. Текстовый файл отличается от символьного не только делением на строки. В текстовой файл можно записать и из него прочитать информацию любого типа. Если эта информация несимвольная, то в процессе чтения или записи происходит ее преобразование из символьной формы во внутреннюю и обратно.
Текстовый файл можно создать или преобразовать с помощью текстового редактора. Его можно просмотреть на экране дисплея или распечатать на принтере.
В программах на Паскале для работы с текстовыми файлами наряду с процедурами Read и Write употребляются процедуры ReadLn и WriteLn.
ReadLn(FV,<CПИСок ввода>)
Эта процедура читает строку из файла с именем FV, помещая прочитанное в переменные из списка ввода.
WriteLn(FV,<список вывода>)
Процедура записывает в файл FV значения из списка вывода, после чего выставляет маркер конца строки.
Для обнаружения конца строки в текстовом файле используется функция
Eoln(FV)
(End of line — конец строки). Это логическая функция, которая принимает значение true, если указатель файла достиг маркера конца строки и false — в противном случае.
Употребление операторов Read и ReadLn без указания имени файловой переменной обозначает чтение из стандартного файла Input (ввод с клавиатуры). Употребление операторов Write и WriteLn без имени файловой переменной обозначает запись в стандартный файл Output (вывод на экран). В таком варианте этими операторами мы уже многократно пользовались. Считается, что файлы INPUT и OUTPUT всегда открываются соответственно для чтения и записи при работе любой программы.
При вводе с клавиатуры маркер конца строки обнаруживается при нажатии на клавишу Enter.
Процедура ReadLn может использоваться без списка ввода. В этом случае происходит пропуск текущей строки в читаемом файле.
Употребление процедуры WriteLn без списка вывода обозначает вывод пустой строки (в файле выставляется маркер конца строки).
При записи в текстовый файл в списке вывода могут присутствовать форматы. Действия форматов мы уже рассматривали при обсуждении вывода данных на экран. Точно так же форматы работают и при выводе в текстовые файлы, связанные с любыми другими устройствами.
Пример 6. Пусть файл с именем 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, не занося их в какую-либо переменную.
Пример 7. В текстовом файле Note.txt определить длину самой большой строки.
Var Note: Text;
Max,К: 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,C); K:=K+1
End;
If K>Max Then Max:=K;
ReadLn(Note)
End;
WriteLn('Наибольшая строка имеет', Max,'знаков');
Close(Note)
End.
Здесь каждая строчка прочитывается посимвольно, при этом в переменной к работает счетчик числа символов в строке. В переменной Мах отбирается наибольшее значение счетчика.