una - programas en fortran ejemplos
Abrir y leer datos en una fila en fortran 90 (2)
Cada declaración de read
Fortran, por defecto, lee una lista de valores y luego avanza al comienzo de la siguiente línea. Piense en read
como mover un cursor a través del archivo de entrada a medida que funciona. Entonces tu declaración
read(100,*) test
hace lo que espera cuando los números en el archivo de entrada están en líneas separadas. Cuando todos están en la misma línea en el archivo, la primera instrucción leída lee un valor (es decir, test
) luego avanza al principio de la siguiente línea para leer el siguiente valor, pero no hay una línea siguiente y se obtiene el error de tiempo de ejecución nos lo has mostrado.
Hay 2 soluciones sencillas.
Uno, podría leer múltiples valores de una línea en una declaración, por ejemplo, podría declarar
real, dimension(10) :: test
entonces
read(100,*) test
debería obtener todos los valores en la matriz de una vez.
En segundo lugar, podría usar non-advancing
entrada que non-advancing
, que le indica al procesador que no salte al principio de la siguiente línea después de cada instrucción read
. Algo como lo siguiente (verifique el descriptor de edición para sus circunstancias)
read(100,''(f8.2)'',advance=''no'') test
Si elige este último enfoque, no olvide que después de haber leído todos los valores de una línea que desea omitir al principio de la siguiente línea, puede que necesite ejecutar una instrucción como
read(100,*)
que no lee ningún valor pero avanza a la siguiente línea.
Hice un código ficticio para aprender a abrir y leer el archivo. Digamos que tengo el siguiente test.dat que dice
1
2
3
4
5
6
7
8
9
10
Escribí el siguiente código para abrir y leer el archivo de datos
subroutine readdata
implicit none
integer :: j
double precision :: test
open(unit = 100, file = ''test.dat'', status = ''old'', action = ''read'')
do j = 1, 10
read(100,*) test
print *, ''N1='', test
end do
end subroutine
El resultado se muestra a continuación, como se esperaba
gfortran -g -I/usr/include -o main main.o subroutines.o -L/usr/lib64/liblapack -L/usr/lib64/libblas
test= 1.0000000000000000
test= 2.0000000000000000
test= 3.0000000000000000
test= 4.0000000000000000
test= 5.0000000000000000
test= 6.0000000000000000
test= 7.0000000000000000
test= 8.0000000000000000
test= 9.0000000000000000
test= 10.000000000000000
Main finished.
Sin embargo, si los datos se almacenan en una sola fila de la siguiente manera
1 2 3 4 5 6 7 8 9 10
entonces el código anterior no funciona como se desea. Solo lee el primer elemento de la fila y luego genera un error
sharwani@linux-h6qd:~/PHD_research/myCodes/data> ./runcase.sh
rm -f *.o *.mod *.MOD *.exe *.stackdump main
gfortran -g -I/usr/include -c main.f90
gfortran -g -I/usr/include -c subroutines.f90
gfortran -g -I/usr/include -o main main.o subroutines.o -L/usr/lib64/liblapack -L/usr/lib64/libblas
test= 1.0000000000000000
At line 9 of file subroutines.f90 (unit = 100, file = ''test.dat'')
Fortran runtime error: End of file
Entonces, mi pregunta es que tengo un archivo de datos que contiene 2879 (1 x 2879) números almacenados en una sola fila. ¿Cómo voy a abrir y leer todos esos números en el archivo de datos?
Como ya se señaló anteriormente, puede leer sus datos en una fila agregando
advance=''no''
y una cadena de formato adecuada (dependiendo de sus datos, por ejemplo ''i2'' está trabajando para una hoja de datos como [1 2 3 4 5 6]) a su comando de lectura. Otro truco útil es cuidar adicionalmente el estado de E / S escribiendo su valor en un parámetro (es decir, io) y saliendo del bucle do sin el error de tiempo de ejecución, incluso si no conoce la longitud de su hoja de datos. Un programa completo podría verse, por ejemplo:
program read
integer::a,io
open(100, file=''data'')
do
read(100,''(i2)'',advance=''no'',IOSTAT=io)a
if (io<0) exit
if (io>0) stop ''problem reading''
write(*,*)a
end do
end program
¡Que te diviertas!