将数据从文件读入数组

时间:2014-11-08 01:55:37

标签: arrays fortran

我无法将文件中的数据读入数组,我是编程新手  和fortran所以任何信息都将是一种祝福。

这是程序正在读取的txt文件的示例

!60         
!USS Challenger    1.51 12712.2 1.040986E+11
!USS Cortez        9.14 97822.5 2.009091E+09
!USS Dauntless     5.76 27984.0 2.599167E+09
!USS Enterprise    2.48  9136.3 1.478474E+10
!USS Excalibur     3.83 32253.0 1.286400E+10
总共有60艘船。变量用空格分隔  如下

翘曲因子,光年距离,实际速度。

这是我使用的当前代码,它给出了错误模块或主要   程序阵列' m'在(1)必须具有恒定的形状

PROGRAM engine_performance
    IMPLICIT NONE
    INTEGER :: i         ! loop index
    REAL,PARAMETER :: c = 2.997925*10**8 ! light years (m/s)
    REAL,PARAMETER :: n = 60 ! number of flights
    REAL :: warpFactor   ! warp factor
    REAL :: distanceLy   ! distance in light years
    REAL :: actualTT     ! actual time travel
    REAL :: velocity     ! velocity in m/s 
    REAL :: TheoTimeT    ! theoretical time travel 
    REAL :: average      ! average of engine performance
    REAL :: median       ! median of engine performance
    INTEGER, DIMENSION (3,n), ALLOCATABLE :: M



    OPEN(UNIT=10, FILE="TrekTimes.txt")

  DO i = 1,n 
      READ(*,100) warpFactor, distanceLY, actualTT
         100 FORMAT(T19,F4.2,1X,F7.1,&
                    1X,ES 12.6)

      WRITE(*,*) M 
  END DO
  CLOSE (10) 
END PROGRAM engine_performance

1 个答案:

答案 0 :(得分:0)

我第一次阅读你的代码时,我错误地将M读作一个数组,在这个数组中你的程序将存储船只文件中的数字。仔细观察后,我意识到(a)M是一个整数数组,(b)代码后面的read语句读取输入文件的每一行,但不会将warpFactor, distanceLY, actualTT存储在任何地方。 / p>

猜测M应该是与每艘船相关的数字因子的表示,这里是如何修复你的代码。如果猜测范围广泛,请说明您要做的事情以及代码中存在的任何问题。

首先,修复M

的声明
REAL, DIMENSION (:,:), ALLOCATABLE :: M

术语(3,n)不能用于可分配数组的声明。因为先前声明n是一个实常数,所以它不能作为数组范围的规范。如果它可能是数组的声明将其维度固定在(3,60),这意味着该数组不能被分配。

因此,也要将n的声明更改为

INTEGER :: n

它不再是一个参数,你将从文件的第一行读取它的值,这就是为什么它首先出现在文件中。

其次,我认为您的数组中已切换行和列。该文件有60行(船只),每行有3列数字数据。因此,当需要分配M时,请使用语句

ALLOCATE(M(n,3))

当然,在此之前,您必须从文件的第一行读取n,但这不应该是一个严重的问题。

第三,将值读入数组。变化

  READ(*,100) warpFactor, distanceLY, actualTT

  READ(*,100) M(i,:)

将读取整行i

最后,在文件的每一行上引导!的那些 - 摆脱它们(使用编辑器或重新创建没有它们的文件)。它们阻止了易读的价值观。使用!当前阅读n需要格式规范,如果没有它,则只需read(10,*)

哦,绝对最后:你应该在你有这个程序工作之后,将你的注意力转移到你最喜欢的Fortran教程中定义类型的主题,并学习如何声明{ {1}}增加了表现力和编程的便利性。