【问题标题】:Read a file with an unknown number rows in Fortran在 Fortran 中读取具有未知行数的文件
【发布时间】:2017-10-30 13:38:21
【问题描述】:

英雄我使用的新代码。我已经尝试过了,如果我先声明了它,它就可以工作,这不是我想要的。我需要知道总行数 (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

【问题讨论】:

  • 您是否尝试阅读此网站?这里有很多类似的问题和答案。顺便说一句 “我不知道该怎么做才能让 fortran 在读取数据帧后弄清楚有多少行。” 不是一个问题,而是一个陈述,即使你放了一个末尾有问号。
  • 比我第一次找到的重复的更多(它包含我的答案只是巧合)。如果它不适合您,我们需要您的数据文件和代码的详细信息才能给出详细的答案。
  • @VladimirF 非常感谢。我编辑了我的问题。您提到的代码是逐行读取数据,但我想要的是略有不同。
  • 好吧,我的回答中确实有解决方案,但如果你想争辩说这个问题不是完全重复的,那么它可能不是。 从不使用“它不起作用”它并没有告诉我们任何有用的信息。告诉我们发生了什么。错误信息?哪些确切的消息?错误的结果?哪个确切的结果? 数据文件是什么样子的?你的行print*,n打印了哪个数字?
  • 另外,请勿使用小于 10 的单元号。某些单元号是保留的。不要使用 2 号单元。使用高于 10 的单元号。

标签: fortran fortran90


【解决方案1】:

您不能声明具有未知维度“dimension(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),它通过在读取新行时添加新元素来重新分配数组 xy

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

【讨论】:

  • 谢谢M.C,非常感谢。这实际上完美无缺,这就是我所需要的。欢呼
  • 请问这段代码是什么意思? {READ(2,*,iostat=io) IF (io/=0) 退出} 。非常感谢
  • 它读取行而不读取数据,如果READ()操作成功(io=0)则跳转到下一行或(io/=0)它存在于循环中。跨度>
  • 太棒了。谢谢你的第二个代码。我更喜欢它。
  • 我没有任何经验,我知道自动重新分配会使程序运行缓慢,但我认为 i/o 也很慢。不建议在调用多次(>10000)的部分代码中使用自动重新分配。
猜你喜欢
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
相关资源
最近更新 更多