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