Файловый ввод/вывод

Программы служат для обработки информации. Откуда она берется? Ведь много информации с клавиатуры не введешь. Кроме того, часть информации может быть получена в процессе работы других программ. Списывать результат на бумагу и потом по новой набивать с кавиатуры - не самое приятное времяпровождение. А для расчета современных инженерных объектов могут потребоваться тысячи чисел. Для хранения информации используются файлы.

Точного определения файла дать сложно. Наверное, наиболее распространенное звучит примерно так:
"Файл - именованная совокупность данных, расположенная в память копьютера". Дело в том, что файл - логический объект, физическое представление зависит от компьютера, операционной системы и ряда других факторов, да в большинстве случаев и не нужно программисту. Для него достаточно того, что в файл можно записать какую то информацию, а затем считать ее.

До этого момента предполагалось, что весь вывод происходит на экран, а весь ввод – с клавиатуры. Рассмотрим программу расчета сложного инженерного изделия (например, ЛА). Входными данными для нее являются несколько десятков параметров, выходными - несколько тысяч. Если требуется рассчитать с помощью такой программы разные варианты изделия, потребуется несколько раз запускать программу, каждый раз вводя с клавиатуры все входные данные, хотя изменяются только 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() указывается номера открытого файла:

   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

 

 

Hosted by uCoz