有没有办法比较用 Fortran 编写一行文本文件的格式



我正在开发一个Fortran程序,该程序必须从文本文件中获取一些数据,并使用第一个文本文件中的特定数据生成另一个文本文件。输入文件有许多行以我知道的几种特定格式编写。虽然我知道格式,但这个文件中的行是以"随机方式"生成的。

如果我能比较每行的写入格式,那么生成输出文件会容易得多,然后我将确切地知道我可以从输入文件的该行中获取哪些数据以在输出文件中使用它。

我需要的是,例如,知道在LINHA变量中读取和存储的行的格式在FORMATO变量中描述,执行以下操作:    

IF (FORMATO = '(1X, 15,3F8.1,2 (5A, 1X))') THEN
  READ (LINHA, '(6X, F8.1)') my_variable
END IF

因为可能还有另一种格式,例如

'(6A, 2F8.1, F8.6,2 (6A))'

其中,如果我使用相同的READ语句,我将在 my_variable 中读取一个 F8.1 变量,但是这个值不正确。

我能想到的一个(不太优雅的(解决方法是使用 read()advance = no 选项读取整行并分别解析行中的每个字符。这样做时,您可以计算空格或您知道的其他特定字符,然后从那里识别不同的格式。如果您能提供更多任务性质的规格,将会很有帮助。

最好的选择是无格式读取,将每一行保留在字符数组中。然后使用变量 IOSTAT 将行变量读取为具有所需格式的内部文件,以检查格式是否正确。

INT max_size = 80
CHARACTER(LEN=max_size) :: line
READ(*,*) line
READ(line,'(1X, 15,3F8.1,2 (5A, 1X))',IOSTAT=ios) var1, var2, ...

使用发布的一些建议的混合解决了问题。我在内部变量(RLINFILE(中以"(A165("格式读取输入文件的每一行。之后,我读取了我放入这个内部变量中的字符串的所有内容在几个虚拟变量中,使用我知道的我想从中获取一些信息的行的格式(读取所需行的所有信息并获得 IOSTAT = 0 保证这是正确的行(, 因此,如果读数结果正常(IOSTAT = 0(,那是因为我刚刚阅读的行对于我想要的信息是正确的,所以我存储了一些代表我感兴趣的值的虚拟变量的内容。在代码中,解决方案如下所示:

OPEN(UNIT=LU1,FILE=RlinName,STATUS='OLD')
ilin = 0
formato = '(14X,A,1X,F7.1,1X,F7.1,5X,A,1X,A,1X,A,5X,A,I5,1X,A,I3,3F8.1,A,A,A,1X,A,2(1X,F8.2),1X,A,1X,A)'
DO WHILE (.TRUE.)
  READ(LU1,'(A165)',END=300) RLINFILE
  READ(RLINFILE,formato,IOSTAT=linhaok) dum2_a1,dum2_f1,dum2_f2,dum2_a2,dum2_a3,dum2_a4,dum2_a5,dum2_i1,dum2_a6,dum2_i2,dum2_f3,dum2_f4,dum2_f5,dum2_a7,dum2_a8,dum2_a9,dum2_a10,dum2_f6,dum2_f7,dum2_a11,dum2_a12
  IF(linhaok.EQ.0) THEN
    ilin = ilin+1
    rlin_lshu(ilin) = dum2_a4
    rlin_nbpa(ilin) = dum2_i1
    rlin_ncir(ilin) = dum2_i2
    rlin_ppij(ilin) = dum2_f3
    rlin_pqij(ilin) = dum2_f4
    rlin_tapn(ilin) = dum2_a7
  END IF
END DO
300 CLOSE(UNIT=LU1)

您尝试解决的问题的描述对我来说有点模糊,但是考虑到问题的描述,我想到的最简单的解决方案是修改生成输入数据文件的原始代码,在输入文件中的数据行之前写入使用的Fortran READ格式。这样,您可以将格式读取为字符串,并在第二个代码的后续数据 IO 中使用它。

如果您更详细地描述您尝试完成的特定任务,也许更有经验的Fortranners可能会有所帮助。

最新更新