Saltar al contenido

En fortran cómo leer todas las cadenas línea por línea de un archivo .dat en fortran

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:

  1. La línea read(*, *) command(i) lee el primer elemento de la entrada estándar, no del archivo. Creo que quieres read(9, *).
  2. 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).
  3. 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
    
  4. 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
    
  5. 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 a IOSTAT siendo distinto de cero, incluso si no ha llegado al final del archivo. Siempre lee un character 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

  1. leer columnas en cadenas
  2. leer números reales de cadenas
  3. 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

  1. leer columnas en variables (cadenas, enteros o reales)
  2. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *