如何从文件中读取大量数据并将其存储在变量中?

时间:2019-04-24 10:45:29

标签: fortran fortran90

我有一个在每个元素上都有压力值的文件。我需要元素编号(ELNO)和压力(PLOAD)并通过子例程。我无法从文件中单独读取它们。 从S175开始,数据读取如下所示。

我希望能够读取此文件(例如A0001.txt),然后逐行读取各行。当读取行时,我想将第一个点后的数字(例如1007、1008等)存储到变量ELNO中,并将最后一个逗号后的数字存储在变量PLOAD中。这是因为我将需要ELNO的每个值,并通过IF循环检查条件。

我的问题是读取文件并将其存储在ELNO(i)之类的变量中。名称S175是常量。

我认为我理解逻辑。我必须将每个像字符串一样存储,并从字符串的第6个位置开始迭代,直到找到第一个“,”并将其存储在ELNO(i)中。但是我是FORTRAN的新手,无法获得它。在过去的一周中,我一直在尝试学习FORTRAN来做到这一点。但是,无法解决此问题。

我在下面尝试了这样的代码,但是由于我没有将其置于循环中,因此无法逐行读取。

     S175.1007,P,0.221948
     S175.1008,P,0.221943
     S175.1009,P,0.221929
     S175.1010,P,0.222287
     S175.1018,P,0.222438
     S175.1019,P,0.222425
     .....
     .....
     .....
     .....
     .....
     S175.13000,P,-1990
     S175.13001,P,-1980
     S175.13002,P,-2009

  PROGRAM BARGE 
     implicit none    
     CHARACTER X*80
     OPEN(UNIT=60, FILE="A0001.txt", ACCESS='SEQUENTIAL', ACTION='READ')
     READ(UNIT=60, FMT='(A)', END=10)X
  10 OPEN(UNIT=61, FILE="2.txt", ACTION="write")
     WRITE (UNIT=61,FMT='(A)')X 


  END PROGRAM BARGE

2 个答案:

答案 0 :(得分:1)

使用Fortran的 list-directed 输入从诸如S175.1019,P,0.222425这样的行中读取数据项将很容易。以下代码段可以替换OP自己的答案中的do循环:

DO
  READ(UNIT=60, FMT='(A)', IOSTAT=SUCCESS) PRES
  IF (SUCCESS.NE.0) EXIT
  READ(PRES(6:),*) ELNO, P, PLOAD
  WRITE(*,*) ELNO, PLOAD
END DO

要使其正常工作,您必须包含一个声明,例如

CHARACTER(LEN=1) :: P

捕获输入文件每一行中的字母P。重要的是这一行

READ(PRES(6:),*) ELNO, P, PLOAD

使用编辑描述符*来告诉编译器/运行时,该方法找出如何从第6个字符及其后的字符中读取三个变量(一个整数,一个字符,一个实数)的值。第PRES行。

幸运的是,对于一个干净利落的输入文件(例如所示的文件),编译器可以轻松读取值,而无需对所有,进行扫描。如果对于另一个应用程序,您需要使用固有函数index在一行中查找字符的出现。

答案 1 :(得分:0)

谢谢大家。我自己完成了。可能有一种更简便,更快捷的方法,但是效果很好。让我知道是否有更有效的方法。我可以学习。 :)

   PROGRAM BARGE    
     implicit none    
     CHARACTER PRES*80       
     INTEGER  :: SUCCESS
     INTEGER  :: K, L, M, ELNO    ! K is for the element number,L is word P and M is for pressure value
     REAL     :: PLOAD
     OPEN(UNIT=60, FILE="1.txt", ACCESS='SEQUENTIAL', ACTION='READ')
     DO
        READ(UNIT=60, FMT='(A)', IOSTAT=SUCCESS)PRES
        IF (SUCCESS.NE.0) EXIT
        K=6
        DO WHILE (PRES(K:K) .NE. ',')
           K=K+1
        END DO          

        READ(PRES(6:K-1), *) ELNO
        PRINT *, ELNO     ! ELEMENT NUMBER          
        L=K+1

        DO WHILE (PRES(L:L) .NE. ',')
           L=L+1
        END DO


        M=L+1

        DO WHILE (PRES(M:M) .NE. ' ')
           M=M+1
        END DO

        READ(PRES(L+1:M-1), *) PLOAD     ! PRESSURE ON THE ELEMENT      
        PRINT *, PLOAD      

        OPEN(UNIT=61, FILE="2.txt", ACTION="write")
        WRITE (UNIT=61,FMT='(A)')PRES   
     END DO 
  READ (*,*) PRES
  END PROGRAM BARGE
相关问题