Файловый ввод/вывод
Программы служат для обработки информации. Откуда она берется? Ведь много информации с клавиатуры не введешь. Кроме того, часть информации может быть получена в процессе работы других программ. Списывать результат на бумагу и потом по новой набивать с кавиатуры - не самое приятное времяпровождение. А для расчета современных инженерных объектов могут потребоваться тысячи чисел. Для хранения информации используются файлы.
Точного определения файла дать сложно. Наверное, наиболее распространенное звучит примерно так:
"Файл - именованная совокупность данных, расположенная в память копьютера".
Дело в том, что файл - логический объект, физическое представление зависит от
компьютера, операционной системы и ряда других факторов, да в большинстве случаев
и не нужно программисту. Для него достаточно того, что в файл можно записать
какую то информацию, а затем считать ее.
До этого момента предполагалось, что весь вывод происходит на экран, а весь
ввод – с клавиатуры. Рассмотрим программу расчета сложного инженерного изделия
(например, ЛА). Входными данными для нее являются несколько десятков параметров,
выходными - несколько тысяч. Если требуется рассчитать с помощью такой программы
разные варианты изделия, потребуется несколько раз запускать программу, каждый
раз вводя с клавиатуры все входные данные, хотя изменяются только 1-2 параметра.
Для того, чтобы избежать ненужного труда, достаточно сохранить где-нибудь вводимые
данные, а при запуске программы указывать, откуда брать данные. Таким местом
хранения может являться файл. Файл – это некоторый набор информации, связанной
с одной задачей, хранящейся в логически одном месте. Реальное расположение данных
в файле зависит от ОС.
В Fortran-e имеется возможность сохранять данные в файл и читать их из файла.
Для этого файл надо открыть и "связать" с некоторым номером устройства.
Это сложилось исторически – раньше ввод осуществляли с внешних устройств с разными
номерами, вставляя в них колоды перфокарт. Теперь файлы хранятся на магнитных
носителях – дисках, лентах или в оперативной памяти.
Для примера, напишем программу, которая запишет в файл сумму 2-ух введенных чисел.
real a,b,c write(*,*) 'Enter two numbers, please:' read(*,*) a,b c=a+b open(12,FILE='result') write(12,*) 'RESULTS: ' write(12,*) a,'+',b,' is ',c close(12) end
Оператор open(12,FILE='result') "открывает" файл с именем 'result'
и позволяет в дальнейшем писать в него или читать из него ссылаясь на номер
(12). Номер задает программист произвольно.
write(12,*) производит вывод информации в открытый файл, указывая номер в скобках.
close(12) приводит к закрытию файла, т.е. программа не сможет после выполнения
close обращаться к содержимому файла, пока снова не откроет его оператором
open.
Если же программа должна считать информацию из файла, придется использовать оператор ввода READ, опять указав в скобках вместо первой звездочки номер открытого файла, например:
READ (12,*) a,b,c
Операторы работы с файлом
Оператор открытия файла – open()
OPEN ([UNIT=]io-unit [, FILE=name] [, ERR=label]
[, IOSTAT=i-var], slist)
INTEGER :: ifile=10
...
OPEN(10)
OPEN(UNIT=10)
OPEN(UNIT=ifile) OPEN(10,FILE='FILE_NAME.EXT')
Следующие ключевые слова могут определять тип открываемого файла:
FILE=filename; где filename это текстовая строка, которая определяет имя открываемого
файла.
STATUS=st; где st может быть одним из 'OLD', 'NEW', 'REPLACE', 'SCRATCH' или
'UNKNOWN'. Статус 'OLD' определяет файл, который уже должет существовать; при
статусе 'NEW' создается новый файл; при статусе 'REPLACE' удаляется существующий
файл прежде чем будет создан новый (с тем же именем); при статусе 'SCRATCH'
создается временный файл, который существует только пока программа выполняется
и исчезает по ее завершении. В общем случае по умолчанию используется 'OLD'
для ввода и 'NEW' для вывода.
ERR=label; где label есть метка оператора, который будет выполняться в случай
возникновения ошибки при открытии файла. Можно использовать взамен IOSTAT .
IOSTAT=ios; где ios это целая переменная, устанавливается в нуль, если оператор
выполнен успешно или в зависящую от реализации константу в противном случае.
ACTION=act; где act может быть 'READ', 'WRITE' или 'READWRITE', специфицирующие
тип операций, которые будут производиться над файлом.
Некоторые примеры операторов открытия файла:
OPEN (UNIT=10,FILE='1.dat')
OPEN (UNIT=11,FILE='1.dat',STATUS='NEW',IOSTAT=ios)
IF( ios/=0) THEN
WRITE(6,*) 'Error opening file: 1.dat.'
STOP
ENDIF
OPEN (UNIT=12, FILE='rs.res', STATUS='OLD', FORM='FORMATTED', IOSTAT=ios)
Этот оператор используется для того, чтобы закрыть файл, т.е. прервать связь файла с устройством. Для закрытия файла в операторе CLOSE() указывается номера открытого файла:
CLOSE ([UNIT=]unit-number [,IOSTAT=ios])
Например:
OPEN(10,FILE='temp') CLOSE (10) или CLOSE (UNIT=10) или CLOSE (UNIT=nunit, IOSTAT=ios)
Номер устройства может быть задан так:
real ,allocatable:: ar(:,:)
allocate (ar(10,100))
!do i=1,10
! do j=1,100
! ar(i,j)=j!rand()
! end do
!end do
open(5,file="fl")
read(5,*)ar
deallocate(ar)
close(5)
end
Дополнительную информацию можно посмеотреть на:
http://old.cs.msu.su/vm/lec/for/for00009.htm
http://software.basnet.by/Methmath/DocFortr/ManFortr77/Content.htm#4