Fortran - Arquivo de entrada e saída
Fortran permite que você leia e grave dados em arquivos.
No último capítulo, você viu como ler e gravar dados no terminal. Neste capítulo, você estudará as funcionalidades de entrada e saída de arquivos fornecidas pelo Fortran.
Você pode ler e gravar em um ou mais arquivos. As instruções OPEN, WRITE, READ e CLOSE permitem que você faça isso.
Abrindo e fechando arquivos
Antes de usar um arquivo, você deve abri-lo. oopencomando é usado para abrir arquivos para leitura ou gravação. A forma mais simples do comando é -
open (unit = number, file = "name").
No entanto, a declaração aberta pode ter uma forma geral -
open (list-of-specifiers)
A tabela a seguir descreve os especificadores mais comumente usados -
Sr. Não | Especificador e descrição |
---|---|
1 | [UNIT=] u O número da unidade u pode ser qualquer número no intervalo 9-99 e indica o arquivo, você pode escolher qualquer número, mas cada arquivo aberto no programa deve ter um número exclusivo |
2 | IOSTAT= ios É o identificador de status de E / S e deve ser uma variável inteira. Se a instrução aberta for bem-sucedida, o valor ios retornado será zero, caso contrário, um valor diferente de zero. |
3 | ERR = err É um rótulo para o qual o controle salta em caso de algum erro. |
4 | FILE = fname Nome do arquivo, uma sequência de caracteres. |
5 | STATUS = sta Mostra o status anterior do arquivo. Uma string de caracteres e pode ter um dos três valores NEW, OLD ou SCRATCH. Um arquivo de trabalho é criado e excluído quando fechado ou o programa termina. |
6 | ACCESS = acc É o modo de acesso ao arquivo. Pode ter um dos dois valores, SEQUENTIAL ou DIRECT. O padrão é SEQUENCIAL. |
7 | FORM = frm Fornece o status de formatação do arquivo. Pode ter um dos dois valores FORMATTED ou UNFORMATTED. O padrão é UNFORMATTED |
8 | RECL = rl Ele especifica o comprimento de cada registro em um arquivo de acesso direto. |
Após o arquivo ter sido aberto, ele é acessado por instruções de leitura e gravação. Uma vez feito isso, ele deve ser fechado usando oclose declaração.
A instrução close tem a seguinte sintaxe -
close ([UNIT = ]u[,IOSTAT = ios,ERR = err,STATUS = sta])
Observe que os parâmetros entre colchetes são opcionais.
Example
Este exemplo demonstra a abertura de um novo arquivo para gravar alguns dados no arquivo.
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 = 'data1.dat', status = 'new')
do i=1,100
write(1,*) x(i), y(i)
end do
close(1)
end program outputdata
Quando o código acima é compilado e executado, ele cria o arquivo data1.dat e grava os valores da matriz xey nele. E então fecha o arquivo.
Ler e gravar no arquivo
As instruções de leitura e gravação, respectivamente, são usadas para leitura e gravação em um arquivo, respectivamente.
Eles têm a seguinte sintaxe -
read ([UNIT = ]u, [FMT = ]fmt, IOSTAT = ios, ERR = err, END = s)
write([UNIT = ]u, [FMT = ]fmt, IOSTAT = ios, ERR = err, END = s)
A maioria dos especificadores já foi discutida na tabela acima.
O especificador END = s é um rótulo de instrução para onde o programa salta, quando atinge o fim do arquivo.
Example
Este exemplo demonstra como ler e gravar em um arquivo.
Neste programa, lemos o arquivo, criamos no último exemplo, data1.dat, e o exibimos na tela.
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 = 'data1.dat', status='new')
do i = 1,100
write(1,*) x(i), y(i)
end do
close(1)
! opening the file for reading
open (2, file = 'data1.dat', status = 'old')
do i = 1,100
read(2,*) p(i), q(i)
end do
close(2)
do i = 1,100
write(*,*) p(i), q(i)
end do
end program outputdata
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
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