Fortran - Salida de entrada de archivo

Fortran le permite leer datos y escribir datos en archivos.

En el último capítulo, ha visto cómo leer y escribir datos en el terminal. En este capítulo, estudiará las funcionalidades de entrada y salida de archivos proporcionadas por Fortran.

Puede leer y escribir en uno o más archivos. Las declaraciones OPEN, WRITE, READ y CLOSE le permiten lograr esto.

Abrir y cerrar archivos

Antes de utilizar un archivo, debe abrirlo. losopenEl comando se usa para abrir archivos para leer o escribir. La forma más simple del comando es:

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

Sin embargo, la declaración abierta puede tener una forma general:

open (list-of-specifiers)

La siguiente tabla describe los especificadores más utilizados:

No Señor Especificador y descripción
1

[UNIT=] u

El número de unidad u puede ser cualquier número en el rango 9-99 e indica el archivo, puede elegir cualquier número, pero cada archivo abierto en el programa debe tener un número único.

2

IOSTAT= ios

Es el identificador de estado de E / S y debe ser una variable entera. Si la declaración de apertura tiene éxito, el valor de ios devuelto es cero, de lo contrario es un valor distinto de cero.

3

ERR = err

Es una etiqueta a la que salta el control en caso de algún error.

4

FILE = fname

Nombre de archivo, una cadena de caracteres.

5

STATUS = sta

Muestra el estado anterior del archivo. Una cadena de caracteres y puede tener uno de los tres valores NEW, OLD o SCRATCH. Se crea y elimina un archivo borrador cuando se cierra o el programa finaliza.

6

ACCESS = acc

Es el modo de acceso a archivos. Puede tener cualquiera de los dos valores, SECUENCIAL o DIRECTO. El valor predeterminado es SECUENCIAL.

7

FORM = frm

Da el estado de formateo del archivo. Puede tener cualquiera de los dos valores FORMATTED o UNFORMATTED. El valor predeterminado es UNFORMATTED

8

RECL = rl

Especifica la longitud de cada registro en un archivo de acceso directo.

Una vez que se ha abierto el archivo, se accede a él mediante instrucciones de lectura y escritura. Una vez hecho esto, debe cerrarse usando elclose declaración.

La declaración de cierre tiene la siguiente sintaxis:

close ([UNIT = ]u[,IOSTAT = ios,ERR = err,STATUS = sta])

Tenga en cuenta que los parámetros entre paréntesis son opcionales.

Example

Este ejemplo demuestra la apertura de un nuevo archivo para escribir algunos datos en el archivo.

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

Cuando el código anterior se compila y ejecuta, crea el archivo data1.dat y escribe los valores de la matriz xey en él. Y luego cierra el archivo.

Leer y escribir en el archivo

Las declaraciones de lectura y escritura, respectivamente, se utilizan para leer y escribir en un archivo, respectivamente.

Tienen la siguiente sintaxis:

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

La mayoría de los especificadores ya se han analizado en la tabla anterior.

El especificador END = s es una etiqueta de declaración donde el programa salta, cuando llega al final del archivo.

Example

Este ejemplo demuestra cómo leer y escribir en un archivo.

En este programa leemos del archivo que creamos en el último ejemplo, data1.dat, y lo mostramos en la pantalla.

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

Cuando el código anterior se compila y ejecuta, produce el siguiente 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