Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр1.doc
Скачиваний:
3
Добавлен:
19.09.2019
Размер:
1.03 Mб
Скачать

8.3 Процедуры открытия и закрытия файлов:

RESET(F) - открытие существующего файла F на чтение (файловая переменная F связана с существующим файлом MS DOS процедурой ASSIGN). В стандартном Паскале при открытии файла на чтение в динамической памяти создается буфер файла, в который помещается первая запись файла. Для нетипизированных файлов размер записи может быть указан вторым параметром. В ТР буфером является сама файловая переменная, размер буфера в примере пункта 8.2. Если открываемый на чтение файл не существует в файловой системе, возникает ошибка этапа выполнения программы.

REWRITE(F) – создает и открывает на запись новый файл. Если файловая переменная F связана с существующим файлом, то данные этого файла уничтожаются. В стандартном Паскале при открытии файла на запись в динамической памяти создается буфер файла для промежуточного хранения записей. Для нетипизированных файлов размеры записей могут задаваться вторым параметром. В ТР буфером является сама файловая переменная, размер буфера в примере пункта 8.2.

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

8.4 Процедуры ввода/вывода:

WRITE(F, E) - запись значения выражения E базового типа в файл; (не применима к нетипизированным файлам)

READ(F, V) - чтение из файла записи в переменную; (не применима к нетипизированным файлам)

BLOCKREAD; BLOCKWRITE - только для нетипизированных файлов.

SEEK(F, n) - делает доступной для обработки запись n файла F (эта процедура не применима к текстовым файлам);

EOF(F) - функция, возвращает TRUE, если достигнут конец файла F.

При работе с файлами в TP очень полезна функция IORESULT, которая возвращает значение кода ошибки выполнения последней операции ввода/вывода. Следующий фрагмент является шаблоном для открытия файла на чтение. Он позволяет избежать прерывания программы при попытке открытия на чтение не существующего файла

repeat

writeln('введите имя файла'); readln(s);

assign(f,s);

{$I-} {отключение режима прерывания выполнения программы при возникновении ошибки в/в}

reset(f);

{$I+} {включение режима прерывания выполнения программы при возникновении ошибки в/в}

i:=IORESULT;

if i<>0 then begin

writeln('Ошибка',i:3);

writeln('Попробуйте еще');

end;

until i = 0;

Здесь i – переменная типа integer, s – строка. {$I-} – псевдокомментарий – директива компилятору при выполнении дальнейших действий снять контроль проверки правильности выполнения операции ввода/вывода. Если открытие файла F прошло успешно, то IORESULT возвращает значение 0, в противном случае IORESULT возвращает код ошибки, отличный от нуля.

Лекция 9

9.1 Текстовые файлы.

Текстовый файл (описатель text в отличие от типизированного файла file of char) представляет собой файл символов, сгруппированных в строки. Разбиение на строки обеспечивается признаком (комбинаций символов) конца строки. Для текстовых файлов существует специальный вид операций чтения и записи (read, write, readln, writeln), который позволяют считывать и записывать значения, тип которых отличается от символьного типа (это действительные, целочисленные типы и строки, выводить можно также и данные булевского типа). Такие значения автоматически переводятся в символьное представление и обратно. Например, Read(f,i), где i - переменная целого типа, приведет к считыванию последовательности цифр, интерпретации этой последовательности как десятичного числа, и сохранению его в i. Предопределены две стандартные переменные типа text – это Input и Оutput. Стандартная файловая переменная Input – это доступный только для чтения файл, связанный со стандартным файлом ввода операционной системы (обычно это клавиатура), а стандартная файловая переменная Оutput – это доступный только для записи файл, связанный со стандартным файлом вывода операционной системы (обычно это дисплей). Перед началом выполнения программы файлы Input и Оutput автоматически открываются, как если бы были выполнены следующие операторы:

Assign(Input,'con'); Reset(Input);

Assign(Output,'con'); Rewrite(Output);

После завершения работы программы эти файлы автоматически закрываются.

Обращение к процедурам ввода и вывода для текстовых файлов организуется так:

Read(f,<список элементов ввода>),

write(f,<список элементов вывода>),

readln(f,<список элементов ввода>),

writeln(f,<список элементов вывода>)

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

  • Данные целого типа читаются с текущего символа, пропуская лидирующие пробелы, до первого символа, синтаксически не совместимого с представлением целого числа, либо до конца строки файла.

  • Переменная типа CHAR принимает значение текущего символа.

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

  • Данные вещественного типа читаются последовательно из строки файла, пока не будет достигнут символ, синтаксически не совместимый с представлением вещественного числа, либо конец строки файла.

Пример:

VAR I, J : INTEGER; S :STRING[100]; CH : CHAR;

...

READ(f, I, J, CH, S);

Пусть читаемые данные: 36 24 ABCDEFGHIJKLMNOPQRSTUVWXYZ.

После выполнения процедуры READ:

I =36, J = 24, CH = ' ', S = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.

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

program ReadEoln {Плохое решение};

var c:char; f:text;

begin

assign(f,'text.txt');

reset(f); {Нужно использовать шаблон безопасного открытия}

while not(eof(f)) do

begin

read(f,c);

write(c);

end;

close(f);

writeln;

readln;

end.

program Copy {хорошее решение, шаблон!};

var c:char; f:text;

begin

assign(f,'text.txt');

reset(f){Нужно использовать шаблон безопасного открытия};

while not(eof(f)) do

begin while not(eoln(f)) do

begin

read(f,c);

write(c);

end;

readln(f);

writeln;

end;

close(f);

writeln;

readln;

end.

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

Вот два примера работы с текстовыми файлами (предложены Путинцевым А).

{Добавление записей в файл данных о дневной температуре воздуха}

program aprec;

var

DayTemp:record {дневная темперарура}

day:integer; {число}

month:integer; {месяц}

temper:integer; {температура}

end;

f:text;{ файл дневной температуры}

begin

assign(f,'a:\temperat.txt');

append(f); {открываем файл для добавления записи}

{Нужно использовать шаблон безопасного открытия}

write('Введите в одной строке, разделяя пробелами');

writeln(' число, номер месяца и температуру');

write('->');

with DayTemp do

begin

readln(day,month,temper);

writeln(f,day,' ',month,' ',temper);

{Следовало бы указать характеристики длины}

end;

close(f);

writeln('Данные добавлены');

end.

{Чтение записей из файла}

program readrec;

var

DayTemp:record {дневная температура}

day:integer; {число}

month:integer; {месяц}

temper:integer; {температура}

end;

f:text; {файл дневной температуры}

mes:integer;{номер месяца}

n:integer;{кол-во дней месяца, о которых есть данные в файле}

summ:integer; {сумма температур месяца}

sredn:real; {средняя температура}

begin

n:=0;

summ:=0;

writeln('Вычисление среднемесячной температуры.');

write('Месяц->');

readln(mes);

assign(f,'a:\temperat.txt');

reset(f);{Нужно использовать шаблон безопасного открытия}

while NOT EOF(f) do begin

with DayTemp do readln(f,day,month,temper);

{Область действия оператора with}

if DayTemp.month=mes

then begin

n:=n+1;

summ:=summ+DayTemp.temper;

end;

end;

close(f);

if n<>0 then begin

sredn:=summ/n;

writeln('Средняя температура:',sredn:6:3);

end

else writeln('Данных о температуре за',mes:3,' месяц нет.');

end.