在Fortran中读取具有未知行数的文件

在Fortran中读取具有未知行数的文件,fortran,fortran90,Fortran,Fortran90,我使用的新代码。我已经试过了,如果我先声明了n,它就会起作用,这不是我想要的。我需要知道行的总数 (n) 然后在我的模拟中使用这个数字。然而,在变量声明中,我需要在读取数据之前减小xy(n),如果这样做,代码就不会运行 数据文件是两列随机模拟的正常数据 让我们这样说吧 1 3 2 4 3 6 4 8 5 9 6 8 7 1 8 9 99 88 我尝试了下面的代码来确定n,但它不起作用 program reading implicit none integer

我使用的新代码。我已经试过了,如果我先声明了n,它就会起作用,这不是我想要的。我需要知道行的总数 (n) 然后在我的模拟中使用这个数字。然而,在变量声明中,我需要在读取数据之前减小xy(n),如果这样做,代码就不会运行

数据文件是两列随机模拟的正常数据

让我们这样说吧

1  3
2  4
3   6
4  8
5   9
6  8
7   1
8  9
99  88
我尝试了下面的代码来确定n,但它不起作用

     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:n)”的变量

此程序首先读取文件以确定行数:

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
另一种选择(Fortran 2003),它通过在读取新行时添加新元素来重新分配数组
x
y

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

无法声明未知维度为“维度(1:n)”的变量

此程序首先读取文件以确定行数:

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
另一种选择(Fortran 2003),它通过在读取新行时添加新元素来重新分配数组
x
y

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


你读过这个网站吗?这里有许多类似的问题和答案。顺便说一句,“我不知道如何让fortran计算出读取数据帧后的行数。”这不是一个问题,而是一个语句,即使你在末尾加上问号。重复项比我首先找到的多(它包含我的答案只是巧合)。如果它不适合您,我们需要您的数据文件和代码的详细信息,以便能够给出详细的答案。@VladimirF非常感谢您。我编辑了我的问题。你提到的代码是逐行读取数据,但我想要的是稍微不同的东西。答案就在我的答案中,但如果你想说这个问题不是完全重复的,那么它可能不是。永远不要使用“它不起作用”它不会告诉我们任何有用的东西。告诉我们发生了什么事。错误消息?确切的信息是什么?错误的结果?确切的结果是什么?数据文件是什么样子的?您的行
打印了哪一个数字*,n
也不要使用小于10的单元号。一些单元号是保留的。不要使用2号装置。使用高于10的值。您尝试过阅读此网站吗?这里有许多类似的问题和答案。顺便说一句,“我不知道如何让fortran计算出读取数据帧后的行数。”这不是一个问题,而是一个语句,即使你在末尾加上问号。重复项比我首先找到的多(它包含我的答案只是巧合)。如果它不适合您,我们需要您的数据文件和代码的详细信息,以便能够给出详细的答案。@VladimirF非常感谢您。我编辑了我的问题。你提到的代码是逐行读取数据,但我想要的是稍微不同的东西。答案就在我的答案中,但如果你想说这个问题不是完全重复的,那么它可能不是。永远不要使用“它不起作用”它不会告诉我们任何有用的东西。告诉我们发生了什么事。错误消息?确切的信息是什么?错误的结果?确切的结果是什么?数据文件是什么样子的?您的行
打印了哪一个数字*,n
也不要使用小于10的单元号。一些单元号是保留的。不要使用2号装置。使用高于10的东西。谢谢你,M.C,非常感谢。这实际上非常有效,这就是我需要的。干杯我可以问这段代码是什么意思吗?{READ(2,*,iostat=io)IF(io/=0)EXIT}。非常感谢您,Hit在不读取数据的情况下读取该行,如果READ()操作成功(io=0),那么它将跳转到下一行,或者(io/=0)它从循环中存在。太好了。谢谢你的第二个代码。我更喜欢它。我没有任何经验,我知道自动重新分配会使程序运行缓慢,但我认为I/o也很慢。不建议在调用多次(>10000)的代码部分使用自动重新分配。谢谢M.C,非常感谢。这实际上非常有效,这就是我需要的。干杯我可以问这段代码是什么意思吗?{READ(2,*,iostat=io)IF(io/=0)EXIT}。非常感谢您,Hit在不读取数据的情况下读取该行,如果READ()操作成功(io=0),那么它将跳转到下一行,或者(io/=0)它从循环中存在。太好了。谢谢你的第二个代码。我更喜欢它。我没有任何经验,我知道自动重新分配会使程序运行缓慢,但我认为I/o也很慢。不建议在调用多次(>10000)的代码部分使用自动重新分配。