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

问题描述 投票:0回答:2

我有一个文件,每个元素都有压力值。我需要元素编号(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
fortran fortran90
2个回答
1
投票

使用Fortran的列表导向输入来读取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

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

幸运的是,使用一个很好的干净输入文件,如显示的编译器读取值没有问题,所有扫描,的出现是不必要的。如果,对于另一个应用程序,您需要在行中搜索字符的出现次数,请使用内部函数index


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
© www.soinside.com 2019 - 2024. All rights reserved.