Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

О. В. Бартеньев. Современный ФОРТРАН

type(person) line

integer(4) :: code, dco, cco, ut = 2, ub = 3, ir 100 format(2a15)

open(ut, file = 'a.txt', form = 'formatted', access = 'direct', recl = 2 * n) open(ub, file = 'b.dat', form = 'binary')

!Создадим две записи

!Запись без ошибки

write(ut, fmt = 100, rec = 1) person('Blake', 'William') ! Запись с ошибкой

write(ut, fmt = 100, rec = 2) person('maugham', 'W. Somerset')

code = ichar('Z')

! 90 - ASCII-код символа Z

dco = ichar('z') - code

! Вернет dco = 32

ir = 0

 

do

 

ir = ir + 1

! Номер текущей записи в прямом файле

read(ut, fmt = 100, rec = ir) line

! или: read(ut, '(3a)', rec = ir) line

cco = ichar(line.lastn(1:1))

 

if(cco > code) then

! Если первая буква фамилии строчная, то:

line.lastn(1:1) = char(cco - dco)

! переводим строчную букву в прописную;

write(ut, fmt = 100, rec = ir) line

! исправляем ошибку в исходном файле;

write(ub) line

! пишем в двоичный файл

end if

 

if(eof(ut)) exit

! Если ситуация "конец файла"

end do

 

close(ut)

! Закрываем прямой файл

rewind ub

! Контрольный вывод

do while(.not. eof(ub))

 

read(ub) line

 

write(*, *) line

 

end do

 

close(ub)

 

end

 

Результат. Файл a.txt после исправлений (случай CVF; в случае FPS

каждая запись размещается на отдельной строке):

Blake

William

Maugham

W. Somerset

Пояснение. Строчные буквы в таблице ASCII расположены после прописных. Для получения ASCII-кода прописной буквы по известному коду строчной достаточно вычесть из кода строчной буквы dco:

dco = ichar('z') - ichar('Z').

10.14. Удаление записей из файла с прямым доступом

Приводимые в разделе сведения применимы только в FPS, поскольку в обсуждаемом механизме присутствует оператор ENDFILE, неупотребляемый в CVF с прямыми файлами.

346

10. Файлы Фортрана

Способ удаления завершающих записей из файла прямого доступа FPS был рассмотрен в предыдущем разделе.

Удаление ненужных промежуточных записей можно выполнить, пользуясь методом, принятым в системах управления базами данных.

Во-первых, необходимо иметь возможность отмечать удаляемые записи (а также снимать эту отметку). Для этой цели в записи можно выделить отдельное, однобайтовое поле, проставляя в него 1 (.TRUE.), если запись подлежит удалению, или 0 (.FALSE.), если нет. Далее необходимо будет написать процедуру, которая может работать, например, по следующему алгоритму:

обменять помеченные для удаления записи с записями, имеющими наибольшие номера;

установить файл перед первой помеченной для удаления записью и выполнить оператор ENDFILE.

Запуск такой процедуры следует выполнять по мере необходимости, памятуя, что удаленные записи не могут быть восстановлены.

10.15. Выбор типа файла

Двоичные и неформатные файлы имеют очевидные преимущества перед текстовыми:

передача данных выполняется быстрее, поскольку нет потерь на преобразование данных;

в текстовых файлах из-за округления могут возникнуть потери точности;

программировать двоичный и неформатный В/В значительно проще, чем форматный;

двоичные и неформатные файлы, как правило, имеют меньший размер, чем текстовые файлы с теми же данными.

Последнее обстоятельство проиллюстрируем примером:

real(4) :: a(20) = 1255.55

 

open(1, file = 'a.txt')

 

write(1, '(5f8.2)') a

! Размер текстового файла 168 байт

open(2, file = 'a.dat', form = 'binary')

write(2) a

! Размер двоичного файла 80 байт

end

 

Программа создает два файла. В текстовом файле a.txt под данные занято 160 байт и дополнительно 8 байт (2*4) займут символы конца записи. Всего в файле a.txt будет создано 4 записи, каждая запись будет содержать 5 полей длиной по 8 символов. Размер двоичного файла a.dat составит 80 байт: всего в файл будет выведено 20 элементов по 4 байта каждый. То есть в случае двоичного файла имеем существенную экономию внешней памяти.

347

О. В. Бартеньев. Современный ФОРТРАН

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

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

348