write una programas matriz manejo leer escritura escribir ejemplos datos crear como caracteres archivos archivo fortran fortran90

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!