3.7 Comandos de entrada e saída (I/O)

Desde o início, os programas feitos até o momento utilizou uma entrada já estabelecida dentro do próprio programa através de uma variável. No entanto com o Fortran podemos atribuir valores à uma variável através do teclado ou então através de um arquivo. Isto é o que chamamos de input.

Após o processamento dos dados pelo programa a saída pode ser basicamente de duas maneiras, uma pelo tela do computador ou então para um arquivo no formato ASCII ou binário armazenado no computador. Isto é o que chamamos de output.

Para ler algo e atribuir algum valor para uma variável utilizamos o comando read(*,*). O conteúdo entre parênteses tem como objetivo indicar de qual local será lido, teclado ou arquivo, indicado pelo primeiro asterisco e como será lido, com ou sem formato, indicado pelo segunda asterisco. Na presente forma do comando read o primeiro asterisco indica que será lido do teclado e o segundo asterisco indica que será lido no formato livre.

A variável que será atribuída pelo comando read deve estar coerente com a declaração de variáveis feitas no início do programa. Se for declarada uma variável real o número a ser lido será um número real, se for caracter então será lido um ou um conjunto de caracter. Faremos um programa parar exemplificar a entrada e saída de dados3.8.

!
! PROGRAMA PARA EXEMPLIFICAR I/O, SENDO A ENTRADA PELO TECLADO
! E A SAIDA PELA TELA DO COMPUTADOR
!
program io1
implicit none
!
real(kind=4)   :: r_input,r_output
integer        :: i_input,i_output
character(20)  :: c_input,c_output
!
write(*,*)'Digite um numero real:'
read(*,*) r_input
!
write(*,*)'Digite um numero inteiro:'
read(*,*) i_input
!
write(*,*)'Digite uma frase com ate 20 digitos:'
read(*,*) c_input
!
r_output = r_input
i_output = i_input
c_output = c_input
!
write(*,*)'O que voce digitou como real foi:',r_output
write(*,*)'O que voce digitou como inteiro foi:',i_output
write(*,*)'O que voce digitou como frase foi:',c_output
!
stop
end program io1
!

No programa io1.f90 a saída poderia ser simplesmente as variáveis r_input, i_input e c_input, não teria a necessidade de utilizar as variáveis r_output, i_output e c_output.

As combinações de entrada e saída poderiam ser: (1) teclado-tela, (2) teclado-arquivo, (3) teclado-impressora, (4) arquivo-tela, (5) arquivo-impressora, (6) arquivo-arquivo e (7) programa-tela. Dessas possíveis combinações já utilizamos as combinações (1) e (7), as combinações que envolvem impressoras como output dificilmente iremos utilizá-las pois são poucas as vezes onde acertamos os output e deixamos como desejamos, é preferível verificar o arquivo antes de imprimir um trabalho. A combinação mais comum é a (6), pois geralmente montamos um arquivo de entrada, o programa irá processar as informações e depois o resultado será escrito em um arquivo de saída, fazendo com que a execução do trabalho seja mais rápido além da possibilidade de poder interagir com scripts construídos em bash.

Para exemplificar uma entrada e saída utilizando arquivos, utilizaremos o problema do cálculo do centro de massa de um sistema de partículas. Primeiramente criaremos um arquivo com o nome entrada.dat, com o joe, com o seguinte conteúdo abaixo, em que a primeira linha indica a coordenada $x_1$, $y_1$, $z_1$ e massa $m_1$ da partícula 1, ...e a quinta linha indica a coordenada $x_5$, $y_5$, $z_5$ e massa $m_5$ da partícula 5.

4.37 1.23 9.55 0.125
9.27 -1.23 0.51 0.333
3.35 8.23 6.53 0.975
7.23 -8.73 4.59 0.229
1.22 15.12 5.88 0.434

O programa será:

!
! PROGRAMA PARA CALCULAR O CENTRO DE MASSA
! COMPOSTA POR 5 PARTICULAS
!
! EXEMPLO DA UTILIZACAO DE VARIOS ARRAYS UNIDIMENSIONAIS
! E TAMBEM A ENTRADA COMO SENDO UM ARQUIVO E A SAIDA TAMBEM
! PARA UM ARQUIVO
!
program rcm2
implicit none
!
! DECLARACAO DE VARIAVEIS
real(kind=4), dimension(5) :: x, y, z, m
real(kind=4) :: xcm, ycm, zcm, mtotal
integer :: i, j, k, error_input, error_output
!
! ZERANDO AS VARIAVEIS
error_input  = 0
error_output = 0
!
! ARQUIVO DE ENTRADA
open (UNIT=20, FILE='entrada.dat', STATUS='OLD', ACTION='READ',  IOSTAT=error_input)
! ARQUIVO DE SAIDA
open (UNIT=21, FILE='saida.dat', STATUS='REPLACE', ACTION='WRITE', IOSTAT=error_output)
!
! CONDICAO QUE VERIFICA A ABERTURA DOS ARQUIVOS DE ENTRADA
if ( error_input /= 0  ) then
        write(*,*)'PROBLEMA COM ARQUIVO DE ENTRADA !!! '
else
        write(*,*)'ARQUIVO DE ENTRADA ABERTO COM SUCESSO !!!'
end if
! CONDICAO QUE VERIFICA A ABERTURA DOS ARQUIVOS DE SAIDA
if ( error_output /= 0 ) then
        write(*,*)'PROBLEMA COM ARQUIVO DE SAIDA !!! '
else     
        write(*,*)'ARQUIVO DE SAIDA ABERTO COM SUCESSO !!!'
end if
!
! LENDO ARQUIVO DE ENTRADA, UNIDADE 20, NOME ENTRADA.DAT
do i=1,5
        read(20,*) x(i),y(i),z(i),m(i)
end do
!
! ZERANDO AS VARIAVEIS
xcm = 0
ycm = 0 
zcm = 0
mtotal = 0 
!
! CALCULANDO O SOMATORIO DO CENTRO DE MASSA
do i=1, 5
        xcm = xcm + (x(i) * m(i))
        ycm = ycm + (y(i) * m(i))
        zcm = zcm + (z(i) * m(i))
        mtotal = mtotal + m(i)   
end do
!
! CALCULANDO O CENTRO DE MASSA
xcm = xcm / mtotal
ycm = ycm / mtotal
zcm = zcm / mtotal
!
! ESCREVENDO PARA O ARQUIVO SAIDA.DAT, UNIDADE 21
write(21,*) xcm, ycm, zcm
!
close(20)
close(21)
!
stop
end program rcm2
!

Detalhes do programa: