Hola usuario de nuestra página web, tenemos la solución a tu pregunta, deslízate y la hallarás más abajo.
Solución:
Hay algunas cosas que noto de inmediato:
- La línea
read(*, *) command(i)
lee el primer elemento de la entrada estándar, no del archivo. Creo que quieresread(9, *)
. - De hecho, probablemente querrás
read(9, '(A)')
porque desea leer la línea completa, no solo hasta el primer elemento separador (es decir, espacio o coma). -
En su subrutina, vuelve a abrir el archivo, bajo la misma unidad. Eso es … peligroso si no incorrecto. Es mejor leer el archivo y luego usar el
rewind
comando para mover la posición de lectura al principio del archivo.program atom_test implicit none integer :: ios integer, parameter :: read_unit = 99 character(len=200), allocatable :: command(:) character(len=200) :: line integer :: n, i open(unit=read_unit, file='data.dat', iostat=ios) if ( ios /= 0 ) stop "Error opening file data.dat" n = 0 do read(read_unit, '(A)', iostat=ios) line if (ios /= 0) exit n = n + 1 end do print*, "File contains ", n, "commands" allocate(command(n)) rewind(read_unit) do i = 1, n read(read_unit, '(A)') command(i) end do close(read_unit) do i = 1, n print*, command(i) end do end program atom_test
-
Si ya dedicas 3000 líneas al principio, no hay una razón real para leer todo dos veces:
program atom_test implicit none integer :: ios integer, parameter :: read_unit = 99 character(len=200) :: command(3000) integer :: n, i open(unit=read_unit, file='data.dat', iostat=ios) if ( ios /= 0 ) stop "Error opening file data.dat" n = 0 do read(read_unit, '(A)', iostat=ios) command(n+1) if (ios /= 0) exit n = n + 1 end do print*, "File contains ", n, "commands" close(read_unit) do i = 1, n print*, command(i) end do end program atom_test
-
En su subrutina para leer el número de líneas en el archivo, intenta leer un
REAL
de un archivo donde la primera palabra no suele ser un número. Esto puede llevar aIOSTAT
siendo distinto de cero, incluso si no ha llegado al final del archivo. Siempre lee uncharacter
variable.
Esta publicación proporciona una respuesta al comentario de OP:
Quiero obtener los elementos por separado de las filas ATOM en mi archivo de datos
Asumiendo input.txt
parece:
ATOM 1 S2 LJ2 1 17.000 15.030 11.630 1.00 0.00
ATOM 2 S2 LJ2 2 13.290 11.340 15.900 1.00 0.00
ATOM 3 S2 LJ2 3 17.030 23.070 14.750 1.00 0.00
ATOM 4 S2 LJ2 4 15.360 14.840 9.480 1.00 0.00
ATOM 5 S2 LJ2 5 15.780 4.560 9.580 1.00 0.00
ATOM 6 S2 LJ2 6 5.350 22.490 11.110 1.00 0.00
ATOM 7 S2 LJ2 7 19.940 3.910 10.840 1.00 0.00
ATOM 8 S2 LJ2 8 20.380 13.360 15.680 1.00 0.00
ATOM 9 S2 LJ2 9 18.340 4.200 7.720 1.00 0.00
ATOM 10 S2 LJ2 10 18.610 16.530 9.910 1.00 0.00
Tú podrías
- leer columnas en cadenas
- leer números reales de cadenas
- mostrar los resultados
program fort
integer n, i
parameter (n=10)
real r1(n), r2(n), r3(n), r4(n), r5(n), r6(n), r7(n)
character(len=255) format, s1(n), s2(n), s3(n), s4(n), s5(n),
& s6(n), s7(n), s8(n), s9(n), s10(n)
i=1
open(unit=99, file='input.txt')
2 read(99,3,end=1) s1(i), s2(i), s3(i), s4(i), s5(i),
& s6(i), s7(i), s8(i), s9(i), s10(i)
i=i+1
goto 2
3 format(a6,2a4,a5,a4,3a8,a6,a4)
4 format(a6,f4.1,2x,2a4,f4.1,5f8.3)
1 close(99)
read(s2,*) r1
read(s5,*) r2
read(s6,*) r3
read(s7,*) r4
read(s8,*) r5
read(s9,*) r6
read(s10,*) r7
do i=1,n
write(*,4) s1(i), r1(i), s3(i), s4(i), r2(i),
& r3(i), r4(i), r5(i), r6(i), r7(i)
enddo
end
producción:
ATOM 1.0 S2 LJ2 1.0 17.000 15.030 11.630 1.000 0.000
ATOM 2.0 S2 LJ2 2.0 13.290 11.340 15.900 1.000 0.000
ATOM 3.0 S2 LJ2 3.0 17.030 23.070 14.750 1.000 0.000
ATOM 4.0 S2 LJ2 4.0 15.360 14.840 9.480 1.000 0.000
ATOM 5.0 S2 LJ2 5.0 15.780 4.560 9.580 1.000 0.000
ATOM 6.0 S2 LJ2 6.0 5.350 22.490 11.110 1.000 0.000
ATOM 7.0 S2 LJ2 7.0 19.940 3.910 10.840 1.000 0.000
ATOM 8.0 S2 LJ2 8.0 20.380 13.360 15.680 1.000 0.000
ATOM 9.0 S2 LJ2 9.0 18.340 4.200 7.720 1.000 0.000
ATOM 10.0 S2 LJ2 10.0 18.610 16.530 9.910 1.000 0.000
Un mejor enfoque consiste en
- leer columnas en variables (cadenas, enteros o reales)
- mostrar los resultados
program fort
integer n, i
parameter (n=10)
integer i1(n), i2(n)
real r1(n), r2(n), r3(n), r4(n), r5(n)
character(len=255) format, s1(n), s2(n), s3(n), s4(n), s5(n),
& s6(n), s7(n), s8(n), s9(n), s10(n)
i=1
open(unit=99, file='input.txt')
2 read(99,3,end=1) s1(i), i1(i), s3(i), s4(i), i2(i),
& r1(i), r2(i), r3(i), r4(i), r5(i)
i=i+1
goto 2
3 format(a6,i4,a4,a5,i4,3f8.3,2f6.2)
4 format(a6,i4,2x,2a4,i4,5f8.3)
1 close(99)
do i=1,n
write(*,4) s1(i), i1(i), s3(i), s4(i), i2(i),
& r1(i), r2(i), r3(i), r4(i), r5(i)
enddo
end
valoraciones y comentarios
Recuerda dar visibilidad a esta noticia si te valió la pena.