Read a file with an unknown number rows in Fortran

不问归期 提交于 2020-02-14 02:33:07

问题


Heroes the new code I used. I have tried this, and it works if I have n declared first, which is not what I want. I need to know the total number of rows (n) and use that number afterward in my simulation. However, in variable declaration I need to have the diminution of my xy(n) before reading the data and if I do that, the code does not run.

the data file is two column of randomly simulated normal data

lets say something like this

1  3
2  4
3   6
4  8
5   9
6  8
7   1
8  9
99  88

I tried the following code to determine n but it did not work!

     program reading

implicit none
integer,allocatable :: a(:,:)
  integer :: pair(2)
  integer :: unit, n, io,k
!!!variable declaration 

 real, dimension(1:n)::x,y
 integer:: T, I1, I2, I3, i, j, dist
open(2, file = 'xyBVNData_R.txt', status = 'old', action = 'read')


n = 0 
DO
  READ(2,*,iostat=io)
  IF (io/=0) EXIT
  n = n + 1
END DO
CLOSE (2)
  print*, n



 DO i=1,n!!!
  DO j=1,n!!
 dist=0.0
 DIST = dist+(sqrt((x(i)-x(j))**2 + (y(i)-y(j))**2))

 ENDDO
     ENDDO

 !!! writing and saving 
 Do i= 1, n 
  write(*,*) i, x(i)
 ENDDO
end program reading

回答1:


You can't declare variables with unknown dimension "dimension(1:n)".

This program first reads the file to determine the number of rows:

program reading
  implicit none
!  variable declaration 
  real, dimension(:) ,allocatable :: x ,y 
  real :: dist
  integer:: i, j ,n ,io

  open(2, file = 'xyBVNData_R.txt', status = 'old', action = 'read')

  n = 0 
  DO
    READ(2,*,iostat=io)
    IF (io/=0) EXIT
    n = n + 1
  END DO
  print*, n

  allocate( x(n) ,y(n) )
  rewind(2)
  DO i =1,n
    READ(2,*) x(i),y(i)
  END DO

  dist=0.0
  DO i=1,n
    DO j=1,n
      dist = dist + sqrt( (x(i)-x(j))**2 + (y(i)-y(j))**2 )
    END DO
  END DO

  ! writing and saving 
  DO i= 1, n 
    write(*,*) i, x(i)
  END DO

end program reading

Another alternative (Fortran 2003), it reallocates the arrays x and y by adding the new element when a new line is read:

program reading
  implicit none
!  variable declaration 
  real, dimension(:) ,allocatable :: x ,y 
  real :: dist ,x_tmp ,y_tmp
  integer:: i, j ,n ,io

  open(2, file = 'xyBVNData_R.txt', status = 'old', action = 'read')

  n = 0 
  allocate( x(0) ,y(0) )
  DO
    READ(2,*,iostat=io) x_tmp,y_tmp
    x = [x,x_tmp]
    y = [y,y_tmp]
    IF (io/=0) EXIT
    n = n + 1
  END DO
  print*, n

  dist=0.0
  DO i=1,n
    DO j=1,n
      dist = dist + sqrt( (x(i)-x(j))**2 + (y(i)-y(j))**2 )
    END DO
  END DO

  ! writing and saving 
  DO i= 1, n 
    write(*,*) i, x(i)
  END DO

end program reading


来源:https://stackoverflow.com/questions/44256136/read-a-file-with-an-unknown-number-rows-in-fortran

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!