Entrada e Saída com Arquivos

O Fortran possui uma vasta gama de opções de Entrada/Saída (I/O em inglês), as quais permitem diferentes tipos de arquivos se conectarem ao programa principal tanto para leitura quanto para gravação.

Em Fortran, um arquivo é conectado a uma unidade lógica definida por um rótulo (numero inteiro).

Cada unidade geralmente possui diversas propriedades conforme a Tabela 1.

Tabela 1. Propriedades de Unidades em Fortran

Propriedade Descrição
Arquivo Nome do arquivo conectado
Ação Leitura, Gravação, Leitura e Gravação
Status OLD, NEW, REPLACE
Método de Acesso Sequencial ou Direto

NOTA – Neste texto, na descrição de sintaxe geral, os argumentos entre colchetes ‘[ ]’ são opcionais e entre ” são obrigatórios.

Comando OPEN

O comando OPEN é utilizado para conectar um arquivo em disco à uma unidade lógica e definir algumas características de conexão.

A sintaxe genérica do comando open tem a forma geral:

open(lista-de-especificadores)

OPEN([UNIT=], FILE=, ERR=, STATUS=, ACCESS=, ACTION=, RECL=)

Tabela 2. Características de conexão de unidades lógicas.

Argumentos Descrição
UNIT Especifica um número de referência ao nome do arquivo
FILE Especifica (entre aspas) o nome do arquivo que será conectado
ERR Especifica uma posição lógica de controle caso haja algum erro na abertura do arquivo
STATUS Especifica (entre aspas) o estado do arquivo:
– ‘OLD’ – O arquivo já existe
– ‘NEW’ – O arquivo não existe, será criado
– ‘REPLACE’ – O arquivo será sobrescrito
– ‘SCRATCH’ – O arquivo será temporários e será apagado quando fechado (CLOSE)
– ‘UNKNOWN‘ – Desconhecido, é a forma mais utilizada por padrão.
ACCESS Especifica (entre aspas) o método de acesso:
– ‘DIRECT’ – Acesso direto a registros individuais, obriga o uso da opção RECL
– ‘SEQUENTIAL’ – Acesso sequencial, linha por linha
ACTION Especifica (entre aspas) o modo de acesso do arquivo:
– ‘READ’ – Abre somente para leitura
– ‘WRITE’ – Abre somente para gravação
– ‘READWRITE’ – Abre para leitura e gravação
RECL Especifica o tamanho máximo de um registro aberto para acesso direto.

Exemplo:

OPEN(10,FILE='arquivo_saida.txt',ERR=100,STATUS='REPLACE',&
ACCESS='SEQUENTIAL',ACTION='WRITE')

OPEN(11,FILE='arquivo_entrada.txt',ERR=100,STATUS='OLD',&
RECL=exp,ACCESS='DIRECT',ACTION='READ')

Comando READ

A sintaxe genérica do comando read tem a forma geral:

read(lista-de-especificadores)

READ([UNIT=], [FMT=], IOSTAT=, ERR=, END=, EOR= ADVANCE=, REC=, SIZE=)

Existem algumas características de conexão que não podem ser utilizadas juntas.

Tabela 3. Características de conexão de leitura em unidades lógicas.

Argumento Descrição
UNIT Especifica um número de referência à unidade de leitura declarada em OPEN
FMT Especifica (entre aspas) o formato da leitura dos dados
IOSTAT Código de retorno. Qualquer valor diferente de Zero (0) significa erro
ERR Especifica uma posição lógica de controle caso haja algum erro na abertura do arquivo
END Especifica uma posição lógica de controle caso ocorra erro de fim de arquivo
EOR Especifica uma posição lógica de controle casa ocorra erro de fim de registro
REC Especifica o número do registro que deve ser lido no modo de acesso direto.
ADVANCE Especifica ‘YES’ ou ‘NO’ se deve ou não iniciar a leitura em um novo registro
SIZE Retorna para uma variável o numero de caracteres lidos

Exemplo

READ(10,FMT='(3(F10.7,1X))',REC=exp) a,b,c

READ(*,'(A)',ADVANCE='NO',EOR=12,SIZE=nch) str

Comando WRITE

A sintaxe genérica do comando write tem a forma geral:

write(lista-de-especificadores)

WRITE([UNIT=], [FMT=], IOSTAT=, ERR= ADVANCE=, REC=)

As características da conexão são as mesmas descritas na Tabela 3.

Exemplo

WRITE(10,FMT='(I4)',IOSTAT=stat,ERR=100) valor

WRITE(*,'(I4)',ADVANCE='NO')'Programador'

Comando CLOSE

O comando close() tem a seguinte sintaxe geral

close ([UNIT=]u)

Exemplo

close(unit = 10)

Fonte bibliográfica: Introdução ao Fortran 90 – Ricardo Almeida de Mendonça Küssel – Vers: Abril/2008 – Centro Nacional de Processamento de Alto Desempenho – SP – Universidade Estadual de Campinas


RESUMO

Arquivos: Escrita e Leitura

O Fortran permite ler e escrever em um ou mais arquivos através do uso dos comandos: OPEN, READ,WRITE, e CLOSE.

Abrindo e fechando arquivos

Antes de usar um arquivo, devemos abrir tal arquivo. O comando open é responsável para abrir arquivos para leitura e escrita.
O comando mais simples para abrir um arquivo é:

open (unit = number, file = "name")

Exemplo

! Abrindo um arquivo
open (unit = 10, file = "dados.txt").

! Escrevendo no arquivo
write(10,*) "Oi Mundo"

! Depois de usar o arquivo, devemos fechar

! Fechando um arquivo
close(10)

Meterial Auxiliar

Código Fonte criado na aula do dia 18/05/2016

Exemplo

Esse exemplo demonstra a abertura de um arquivo para escrever dentro dele alguns dados. Esses dados serão os resultados de uma expressão matemática.
f(x)=sin(x)*(1-cos(x/3.0))

program outputdata
implicit none

real, dimension(100) :: x, y
real, dimension(100) :: p, q
integer :: i

! data
do i=1,100
x(i) = i * 0.1
y(i) = sin(x(i)) * (1-cos(x(i)/3.0))
end do

! output data into a file
open(1, file='data.txt', status='new')
do i=1,100
write(1,*) x(i), y(i)
end do

close(1)

end program outputdata

Quando o código fonte acima é implementado, compilado e executado, ele cria um arquivo chamado data.txt e escreve os valores de x e de y dentro dele e depois fecha o arquivo.

Gráfico para f(x)=sin(x)*(1-cos(x/3.0))

Lendo e escrevendo em um arquivo

Os comando read e write são usados respectivamente para ler em um arquivo e para escrever em uma arquivo.
Sintaxe geral:

read([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err, END=s)
write([UNIT=]u, [FMT=]fmt, IOSTAT=ios, ERR=err, END=s)

em que os argumentos (especificadores) já foram mostrados nas tabelas no inicio deste documento.

Obs: O especificador END=s é um comando que especifica um rótulo para onde o programa deve se deslocar (jumps), quando ele encontra o final do arquivo.

Exemplo

Este exemplo demonstra a leitura e escrita em um arquivo. Neste programa vamos fazer a leitura do arquivo que geramos no exemplo anterior, data.txt, e mostrá-lo na tela.

program lerdados
real, dimension(100) :: x, y
real, dimension(100) :: p, q
integer :: i

! Gerando dados
do i=1,100
x(i) = i * 0.1
y(i) = sin(x(i)) * (1-cos(x(i)/3.0))
end do

! saída (escrevendo) de dados em um arquivo
open(1, file='data.txt', status='new')
do i=1,100
write(1,*) x(i), y(i)
end do
close(1) ! Fechando o arquivo 1

! abrindo o arquivo para leitura
open (2, file='data.txt', status='old')

do i=1,100
read(2,*) p(i), q(i)
end do

close(2) ! Fechando o arquivo 2

do i=1,100
write(*,*) p(i), q(i)
end do

end program lerdados

Saída na tela:

0.100000001  5.54589933E-05
0.200000003  4.41325130E-04
0.300000012  1.47636665E-03
0.400000006  3.45637114E-03
0.500000000  6.64328877E-03
0.600000024  1.12552457E-02
0.699999988  1.74576249E-02
0.800000012  2.53552198E-02
0.900000036  3.49861123E-02
1.00000000   4.63171229E-02
1.10000002   5.92407547E-02
1.20000005   7.35742599E-02
1.30000007   8.90605897E-02
1.39999998   0.105371222    
1.50000000   0.122110792    
1.60000002   0.138823599    
1.70000005   0.155002072    
1.80000007   0.170096487    
1.89999998   0.183526158    
2.00000000   0.194692180    
2.10000014   0.202990443    
2.20000005   0.207826138    
2.29999995   0.208628103    
2.40000010   0.204863414    
2.50000000   0.196052119    
2.60000014   0.181780845    
2.70000005   0.161716297    
2.79999995   0.135617107    
2.90000010   0.103344671    
3.00000000   6.48725405E-02
3.10000014   2.02930309E-02
3.20000005  -3.01767997E-02
3.29999995  -8.61928314E-02
3.40000010  -0.147283033    
3.50000000  -0.212848678    
3.60000014  -0.282169819    
3.70000005  -0.354410470    
3.79999995  -0.428629100    
3.90000010  -0.503789663    
4.00000000  -0.578774154    
4.09999990  -0.652400017    
4.20000029  -0.723436713    
4.30000019  -0.790623367    
4.40000010  -0.852691114    
4.50000000  -0.908382416    
4.59999990  -0.956472993    
4.70000029  -0.995793998    
4.80000019  -1.02525222    
4.90000010  -1.04385209    
5.00000000  -1.05071592    
5.09999990  -1.04510069    
5.20000029  -1.02641726    
5.30000019  -0.994243503    
5.40000010  -0.948338211    
5.50000000  -0.888650239    
5.59999990  -0.815326691    
5.70000029  -0.728716135    
5.80000019  -0.629372001    
5.90000010  -0.518047631    
6.00000000  -0.395693362    
6.09999990  -0.263447165    
6.20000029  -0.122622721    
6.30000019   2.53026206E-02
6.40000010   0.178709000    
6.50000000   0.335851669    
6.59999990   0.494883657    
6.70000029   0.653881252    
6.80000019   0.810866773    
6.90000010   0.963840425    
7.00000000   1.11080539    
7.09999990   1.24979746    
7.20000029   1.37891412    
7.30000019   1.49633956    
7.40000010   1.60037732    
7.50000000   1.68947268    
7.59999990   1.76223695    
7.70000029   1.81747139    
7.80000019   1.85418403    
7.90000010   1.87160957    
8.00000000   1.86922085    
8.10000038   1.84674001    
8.19999981   1.80414569    
8.30000019   1.74167395    
8.40000057   1.65982044    
8.50000000   1.55933595    
8.60000038   1.44121361    
8.69999981   1.30668485    
8.80000019   1.15719533    
8.90000057   0.994394958    
9.00000000   0.820112705    
9.10000038   0.636327863    
9.19999981   0.445154816    
9.30000019   0.248800844    
9.40000057   4.95488606E-02
9.50000000  -0.150278628    
9.60000038  -0.348357052    
9.69999981  -0.542378068    
9.80000019  -0.730095863    
9.90000057  -0.909344316    
10.0000000  -1.07807255    

DESAFIO:
1. Implemente o código anterior para:
a. Ler os dados de x no formato com uma casa decimal e y com 3 casas decimais.
b. Mostrar os dados de x no formato com uma casa decimal e y com 3 casas decimais.
c. Escrever no arquivo dados.txt x no formato com uma casa decimal e y com 3 casas decimais.


IDPGPF-1817

Anúncios