Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Paskal_uchebn_posob_chast2_26_6_7

.pdf
Скачиваний:
46
Добавлен:
09.04.2015
Размер:
670.28 Кб
Скачать

 

 

 

41

 

 

 

 

 

 

 

ПРОЦЕДУРА WRITE.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обеспечивает

вывод

информации в текстовый файл или передачу

ее на логическое устройство. Формат обращения:

 

 

 

 

 

WRITE(<ф.п.>,<сп.вывода>) или WRITE(<сп.вывода>)

Здесь <сп.вывода> - список вывода: последовательность из одного

или более выражений типа CHAR, STRING, BOOLEAN, а также любого

целого или вещественного типа.

 

 

 

 

 

 

 

 

Файловая переменная

<ф.п.>, если

она указана, должна быть

предварительно описана как переменная типа TEXT и связана с именем

файла или логическим устройством процедурой ASSIGN. Если файловая

переменная отсутствует, подразумевается вывод в

стандартный файл

OUTPUT, который обычно связан с экраном ПК.

 

 

 

 

 

Любой элемент списка вывода может иметь форму:

 

 

 

 

OutExpr [ : MinWidth [ : DecPlaces ] ]

 

 

 

 

 

Здесь OutExpr - выводимое выражение;

 

 

 

 

 

 

MinWidth, DecPlaces - выражение типа WORD (квадратные скобки

означают возможность отсутствия заключенных в них параметров).

Подпараметр

MinWidth,

если

он

присутствует,

указывает

минимальную ширину поля,

в

которое

будет записываться

символьное

представление значения OutExpr. Если

символьное

представление имеет

меньшую длину, чем MinWidth, оно будет дополнено слева пробелами, если - большую длину, то подпараметр MinWidth игнорируется и выводится необходимое число символов.

Подпараметр DecPlaces задает количество десятичных знаков в дробной части вещественного числа. Он может использоваться только совместно с MinWidth и только по отношению к выводимому выражению одного из вещественных типов.

Если ширина поля вывода не указана, соответствующий параметр выводится вслед за предыдущим без какого-либо их разделения.

Символы и строки передаются выводному файлу без изменений, но снабжаются ведущими пробелами, если задана ширина поля вывода и эта ширина больше требуемой для вывода.

При выводе логических выражений в зависимости от их значения выводятся строки TRUE или FALSE. (Ввод логическиих констант процедурами READ или READLN не предусмотрен ).

Вещественные числа выводятся в экспоненциальном формате, если не указан подпараметр DecPlaces, в противном случае выбирается формат представления числа с фиксированной точкой. Экспоненциальный формат представляет вещественное число в виде:

_s#.##############E*####,

где _ -пробел;

PDF created with pdfFactory Pro trial version www.pdffactory.com

42

s - пробел для положительного и знак "-" для отрицательного чисел;

# - десятичная цифра; Е - символ десятичного основания;

* - знак "+" или "-" в зависимости от знака десятичного порядка числа.

Если подпараметр MinWidth опущен, принимается его значение по умолчанию (23). Если MinWidth меньше 10, считается, что он равен 10.

Если подпараметр

DecPlaces равен

нулю, ни дробная часть числа,

ни десятичная точка

не выводятся.

При отрицательном значении

DecPlaces этот параметр игнорируется и число выводится в экспоненциальном формате с учетом MinWidth. Если значение DecPlaces больше 18, принимается значение 18. Следует учесть, что при указании подпараметра DecPlaces вещественное число всегда будет выводиться в

формате с фиксированной точкой и требуемым

количеством знаков в

дробной

части, даже если значение подпараметра MinWidth окажется

недостаточным для размещения

дробной части:

в этом случае значение

MinWidth автоматически увеличивается.

 

 

При

выводе на экран

в случае,

когда длина выводимой

последовательности символов превышает ширину экрана или созданного на нем окна, "лишние" символы переносятся на следующую экранную строку.

При заполнении экрана или окна его содержимое сдвигается в верх на одну строку.

ПРОЦЕДУРА WRITELN.

Эта процедура полностью идентична процедуре WRITE за исключением того, что выводимая строка символов завершается кодами CR и LF. При вызове WRITELN можно опускать параметр <сп.вывода>: в этом случае в файл передается маркер EOLN, что при выводе на экран приведет к переводу курсора в начало следующей строки.

ЛОГИЧЕСКАЯ ФУНКЦИЯ EOLN.

Возвращает TRUE, если во входном текстовом файле достигнут маркер конца строки. Формат обращения:

EOLN (<ф.п.>)

Если параметр <ф.п.> опущен, функция проверяет стандартный файл INPUT.

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

PDF created with pdfFactory Pro trial version www.pdffactory.com

 

 

 

 

43

 

 

 

 

 

 

 

 

 

 

 

 

 

 

чтения

очередного

символа.

Поэтому при работе с

логическим

устройством функция EOLN возвращает TRUE, если последним

считанным с устройства символом был EOLN или EOF, в то время как при

чтении с диска TRUE возвращается в

случае,

если

следующим

считываемым символом будет

EOLN

или EOF.Аналогичное различие

наблюдается и

в функции EOF: для

логического

устройства

TRUE

возвращается в

случае, если последним символом был EOF,

а при чтении

с диска - если следующим считываемым символом будет

EOF. Иными

словами,

функции

тестируют

соответстствующие

признаки

 

 

 

для

логического устройства после очередного чтения, а для файла - перед чтением.

ЛОГИЧЕСКАЯ ФУНКЦИЯ SEEKEOLN.

Пропускает все пробелы и знаки табуляции до маркера конца строки EOLN или до первого значащего символа и возвращает TRUE, если маркер обнаружен. Формат обращения:

SEEKEOLN (<ф.п.>)

Если параметр <ф.п.> опущен, функция проверяет стандартный файл INPUT.

ЛОГИЧЕСКАЯ ФУНКЦИЯ SEEKEOF.

Пропускает все пробелы, знаки табуляции и маркеры конца строки EOLN до маркера конца файла или до первого значащего символа и возвращает TRUE, если маркер обнаружен. Формат обращения:

SEEKEOF (<ф.п.>)

Если параметр <ф.п.> опущен, функция проверяет стандартный файл INPUT.

В следующем примере, иллюстрирующем работу с текстовым файлом, подсчитывается общее количество символов в файле и результат делится на 40000 - таким способом можне оценить об'ем рукописи в так называемых учетно-издательских листах:

var

f: text; s: string; const

Sum: iongint = 0; { здесь будет количество символов }

BEGIN

 

Write('Имя файла');

{ запросить }

Readln(s);

{ и ввести имя файла }

assign(f,s);

 

PDF created with pdfFactory Pro trial version www.pdffactory.com

 

 

44

Reset(f);

 

{ открыть файл }

while not EOF(f) do

 

{ подсчитать }

begin

 

{ количество }

Readln(f,s);

 

{ символов }

inc(Sum, Length(s))

{ в тексте }

end;

{ этой программы }

Close(f);

 

{ закрыть файл }

Writeln('Обьем = ',Sum/40000:6:2,' уч.изд.л.') END.

PDF created with pdfFactory Pro trial version www.pdffactory.com

45

ЛЕКЦИЯ 19. ТИПИЗИРОВАННЫЕ ФАЙЛЫ.

Длина любого компонента типизированного файла строго постоянна, что дает возможность организовать прямой доступ к каждому из них (т.е. доступ к компоненту по его порядковому номеру ).

Перед первым обращением к процедурам ввода-вывода указатель файла стоит в его начале и указывает на первый компонент с номером 0.

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

ПРОЦЕДУРА READ.

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

READ (<ф.п.>,<сп.ввода>)

Здесь <сп.ввода> - список ввода, содержащий одну или более переменных такого же типа, что и компоненты файла.

Файловая переменная <ф.п.> должна быть об'явлена предложением FILE OF ... и связана с именем файла процедурой ASSIGN. Файл необходимо открыть процедурой RESET. Если файл исчерпан, обращение к READ вызовет ошибку ввода-вывода.

ПРОЦЕДУРА WRITE.

Используется для записи данных в типизированный файл. Формат обращения:

WRITE (<ф.п.>,<сп.вывода>)

Здесь <сп.вывода> - список вывода, содержащий одно или более выражений того же типа, что и компоненты файла.

ПРОЦЕДУРА SEEK.

Смещает указатель файла к требуемому компоненту. Формат обращения:

SEEK(<ф.п.>,< N компонента >)

Здесь < N компонента > - выражение типа LONGINT, указывающее номер компонента файла.

Первый компонент файла имеет номер 0. Процедуру нельзя применять к текстовым файлам.

PDF created with pdfFactory Pro trial version www.pdffactory.com

46

ФУНКЦИЯ FILESIZE.

 

Возвращает значение типа LONGINT,

которое содержит число

компонентов файла. Формат обращения:

 

FILESIZE(<ф.п.>)

 

Функцию нельзя использовать для текстовых файлов. Чтобы переместить указаталь в конец файла, можно написать:

seek (FileVar, FileSize(FileVar));

где FileVar - файловая переменная.

ФУНКЦИЯ FILEPOS.

Возвращает значение типа LONGINT, содержащее порядковый номер компонента файла, который будет обрабатываться следующей операцией ввода-вывода. Формат обращения:

FILEPOS (<ф.п.>)

Функцию нельзя использовать для текстовых файлов. Первый компонент файла имеет порядковый номер 0.

PDF created with pdfFactory Pro trial version www.pdffactory.com

47

ЛЕКЦИЯ 20. НЕТИПИЗИРОВАННЫЕ ФАЙЛЫ.

Нетипизированные файлы об'являются как файловые переменные типа FILE и отличаются тем, что для них не указан тип компонентов. Отсутствие типа делает эти файлы, с одной стороны, совместимыми с любыми другими файлами, а с другой - позволяет организовать высокоскоростной обмен данными между диском и памятью.

При инициации нетипизированного файла процедурами RESET или

REWRITE можно

указать

длину

записи

нетипизированного файла в

байтах. Например так:

 

 

 

 

var

 

 

 

 

 

f : file;

 

 

 

 

........

 

 

 

 

 

assign (f, 'myfile.dat ');

 

 

 

reset (f, 512);

 

 

 

 

........

 

 

 

 

 

Длина записи нетипизированного

файла указывается вторым паметром

при обращении к процедурам RESET или REWRITE, в качества которого

может использоваться выражение типа WORD. Если длина записи не

указана, она принимается равной 128 байтам.

 

Турбо-Паскаль не накладывает каких-либо ограничений на длину

записи нетипизированного

файла,

за

исключением требования

положительности и

ограничения

максимальной длины 65535 байтам

(емкость целого типа WORD). Однако для обеспечения максимальной скорости обмена данными следует задавать длину, которая была бы кратна длине физического сектора дискового носителя информации (512 байт).

Более того, фактически пространство на диске выделяется любому файлу порциями - кластерами, которые в зависимости от типа диска могут занимать 2 и более смежных секторов. Как правило, кластер может быть прочитан или записан за один оборот диска, поэтому наивысшую скорость обмена данными можно получить, если указать длину записи, равную длине кластера.

При работе с нетипизированными файлами могут применяться все процедуры и функции, доступные типизированным файлам, за исключением READ и WRITE, которые заменяются соответственно высокоскоростными процедурами BLOCKREAD и BLOCKWRITE. Для вызова этих процедур используются следующие предложения:

BLOCKREAD(<ф.п.>,<буф>,<N>[,<NN>])

BLOCKWRITE(<ф.п.>,<буф>,<N>[,<NN>])

Здесь <буф> - буфер: имя переменной, которая будет участвовать в обмене данными с дисками;

PDF created with pdfFactory Pro trial version www.pdffactory.com

48

<N> - количество записей, которые должны быть записаны или прочитаны за одно обращение к диску;

<NN> - необязательный параметр, содаржащий при выходе из процедуры количество фактически обработанных записей.

За одно обращение к процедурам может быть передано до N*RECS байт, где RECS - длина записи нетипизированного файла. Передача идет, начиная с первого байта переменной <буф>. Программист должен позаботиться о том, чтобы длина внутреннего представления переменной <буф> была достаточной для размещения всех N*RECS байт при чтении информации с диска. Если при чтении указана переменная <буф>

недостаточной длины или если в процессе записи на диск не окажется нужного свободного пространства, возникнет ошибка ввода-вывода, которую можно заблокировать, указав необязательный параметр <NN> (переменная типа WORD).

После завершения процедуры указатель смещается на <NN> записей. Процедурами SEEK, FILEPOS и FILESIZE можно обеспечить доступ к любой записи нетипизированного файла.

PDF created with pdfFactory Pro trial version www.pdffactory.com

49

Семинар. Работа с файлами.

ЗАДАЧА.

Program fzap(input,output); Uses crt;

Type zap=record

fio:packed array[1..10] of char; godr:integer;

end; fpk=file of zap;

Var fizap:fpk; a,b:zap; i,j:integer; Begin

clrscr;

assign(fizap,'res.dat'); rewrite(fizap,'abc.dat) rewrite(fizap); readln;

for j:=1 to 3 do begin

write('=>');

for i:=1 to 10 do read(b.fio[i]); readln(b.godr); write(fizap,b);

end;

close(fizap);

reset(fizap); for j:=1 to 3 do begin

read(fizap,a);

writeln(j:2,'-ая запись ',a.fio ,a.godr:5); end;

End.

Эта программа формирует файл и сохраняет его на внешнемносителе, что обеспечивается заданием внешнего имени abc.dat при открытии файла на запись. Ввод исходной информации осуществляется до тех пор, пока не введется 10 звездочек (признак конца ввода). Это сделано для того, чтобы пользователю не надо было предварительно подсчитывать количество вводимых записей.

ЗАДАЧА

Program stud(output);

PDF created with pdfFactory Pro trial version www.pdffactory.com

50

Uses crt;

Type zap=record fio:array[1..10] of char; godr:integer;

end; fpk=file of zap;

Var fizap,rb:fpk; a:zap; i:integer; Begin

clrscr;

assign(fizap,'abc.dat');

reset(fizap);

assign(rb,'l.dat');

rewrite(rb); repeat

read(fizap,a);

if a.godr>=1945 then write(rb,a); until eof(fizap);

close(rb);

close(fizap);

reset(rb);

rewrite(fizap); repeat

read(rb,a);

writeln(a.fio,a.godr:5);

write(fizap,a); until eof(rb); close(fizap)

End.

В этой программе из внешнего файла с именем abc.dat удаляются все записи ,соответствующие людям, родившимся до 1970 года.Для этого используется рабочий файл с внешним именем l.dat , в который сначала переписываются из внешнего файла все оставляемые записи, затем внешний файл открывается на запись, рабочий файл - на чтение и все содержимое рабочего файла переписывается во внешний файл. При этом

для контроля работы программы оставляемые записи выдаются на терминал.

Пример:

PROGRAM S1(INPUT);

TYPE СИМСТР=FILE OF CHAR;

VAR СПИСОК:СИМСТР;C:CHAR;I,N:INTEGER;

PDF created with pdfFactory Pro trial version www.pdffactory.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]