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

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

10.1. Внешние и внутренние файлы

В Фортране различают два вида файлов: внешние и внутренние. Внешний файл - файл, существующий в среде, внешней по отношению

к выполняемой программе.

Внутренние файл - символьная строка (подстрока) или массив. Внутренние файлы являются открытыми по умолчанию. Внешние

файлы должны быть открыты (подсоединены к устройству В/В) оператором

OPEN.

К файлам Фортрана можно организовать либо последовательный, либо прямой доступ. К некоторым видам файлов - и тот и другой. С внутренними файлами используется только последовательный доступ.

Внешние файлы могут быть:

форматными (текстовыми, ASCII);

двоичными (бинарными);

неформатными.

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

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

10.2. Позиция файла

В результате выполнения операции над внешним файлом он может находиться:

в начальной точке файла - непосредственно перед первой записью;

между соседними записями файла;

в пределах одной записи;

в конечной точке файла - после последней записи до специальной записи "конец файла";

на записи "конец файла";

после специальной записи "конец файла".

Факт перемещения на "конец файла" устанавливается функцией EOF, которая возвращает .TRUE., если файл позиционирован в конце файла или вслед за ним, и .FALSE. - в противном случае.

327

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

Файл оказывается после записи "конец файла", если в результате выполнения оператора READ возникла ситуация "конец файла". Файл не должен быть установлен после записи "конец файла" перед началом передачи данных. Для изменения ситуации в файлах с последовательным доступом употребляются операторы REWIND или BACKSPACE.

10.3. Устройство ввода/вывода

Для передачи данных файл Фортрана подсоединяется к устройству В/В. Устройство внешнего файла задается целочисленным скалярным выражением или звездочкой (*). Возвращаемый им результат называется номером устройства В/В, значение которого должно находиться в

интервале от 0 до 32767.

Устройство внутреннего файла задается переменной стандартного символьного типа.

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

Кроме файлов к устройствам В/В могут быть подсоединены физические устройства, например клавиатура, экран, принтер, параллельный порт. Всегда в каждой Фортран-программе существуют устройства *, 0, 5 и 6. Причем по умолчанию к устройствам *, 0 и 5 подсоединена клавиатура, а к устройствам *, 0 и 6 - экран. Так, в программе

real :: b = 1.2 write(*, '(F6.2)') b write(0, '(F6.2)') b write(6, '(F6.2)') b end

все операторы WRITE обеспечат вывод значения переменной b на экран. Внешний файл подсоединяется к устройству В/В в результате

выполнения оператора OPEN. После подсоединения и устройство и файл считаются открытыми. Доступ к внешнему файлу, после того как он открыт, выполняется по номеру устройства, к которому он подсоединен: все программные компоненты, ссылающиеся на одно и то же устройство, ссылаются на один и тот же файл. Аналогом такого номера являются в СИ указатель на файл, в Паскале - файловая переменная.

Пример:

integer :: k = 2, m = 4

! Устройство В/В - целочисленное скалярное выражение

open(k * m, file = 'd:\a.txt')

! Файл d:\a.txt подсоединен к устройству 8

open(m / k, file = 'd:\b.txt')

! Файл d:\b.txt подсоединен к устройству 2

write(8, '(i8)') k

! Пишем в файл d:\a.txt

 

write(m - k, '(i2)') m

! Пишем в файл d:\b.txt

 

close(8)

! Закрываем устройство 8

и файл d:\a.txt

close(k)

! Закрываем устройство 2

и файл d:\b.txt

328

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

Одно и то же устройство В/В в любой программной единице выполняемой программы ссылается на один и тот же файл, например:

program fOpen

 

integer, parameter :: n = 9

 

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

! Подсоединяем файл a.txt к устройству 9

write(n, *) 'Test string'

! Формируем одну запись в файле a.txt

call ReadFileData( )

! Читает первую запись файла a.txt

end program fOpen

 

subroutine ReadFileData( )

! В подпрограмме устройство 9 ссылается на

character(30) :: st

! файл a.txt

rewind 9

! Переход на начало файла a.txt

read(9, '(a)') st

! Читаем первую запись файла a.txt

print *, st

! Test string

end subroutine ReadFileData

 

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

10.4. Внутренние файлы

Различают два основных типа внутренних файлов:

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

символьный массив. Число записей такого файла совпадает с числом элементов символьного массива. Длина записи файла равна длине элемента символьного массива.

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

Перед исполнением оператора В/В внутренние файлы всегда позиционируются в начало файла. Внутренние файлы после их создания всегда открыты как для чтения, так и для записи. Устройством внутреннего файла является имя строки, подстроки, символьного массива или его элемента.

Часто внутренние файлы применяются для создания строк, содержащих смесь символьных и числовых данных (разд. 3.8.7), а также для простых преобразований "число – строка" и "строка – число", например:

real :: a = 234.55

 

 

integer kb

 

 

character(20) st

 

 

write(st, *) a

! Преобразование "число – строка"

print *, st

!

234.550000

! Для FPS:

 

 

329

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

read(st, '(i8)') kb

! Преобразование "строка – число"

! Для CVF:

 

 

read(st, '(i5)') kb

! Преобразование "строка – число"

print *, kb

!

23

end

 

 

10.5. Внешние файлы

Внешние файлы характеризуются приводимыми ниже понятиями.

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

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

CVF поддерживает два вида организации файла: последовательную

и связанную. В CVF организация задается спецификатором ORGANIZATION оператора OPEN. Файлы, имеющие связанную организацию, сохраняются на диске, последовательную - как на диске, так и на магнитной ленте. Все иные периферийные устройства, такие, как терминалы или принтеры, рассматриваются Фортраном как файлы с последовательной организацией.

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

связанными файлами.

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

В связанных файлах записи имеют одинаковую длину и хранятся в так называемых ячейках. Каждая ячейка имеет номер из диапазона [1, n], где n - номер последней доступной ячейки. Номер ячейки - это номер записи, исчисляемый относительно начала файла. В CVF для удаления записи связанного файла употребляется оператор DELETE.

Фортран поддерживает два метода доступа к внешнему файлу:

последовательный и прямой - и 3 структуры файлов: форматную,

неформатную и двоичную. Поэтому можно создать файлы:

форматные последовательные;

форматные прямые;

неформатные последовательные;

неформатные прямые;

двоичные последовательные;

двоичные прямые.

330