【问题标题】:Is there a way to compare the format in which a line of a text file was written in Fortran?有没有办法比较用 Fortran 编写的文本文件行的格式?
【发布时间】:2018-07-11 20:15:19
【问题描述】:

我正在开发一个 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 变量,但是这个值不是正确的。

【问题讨论】:

  • 我看不出发布代码如何帮助解决这个问题。如果你知道如何,你可以简单地展示如何。如果有人问我如何使用 fortran 在屏幕上写一些没有特定格式的东西,我可以回答说:使用 WRITE (*, *) "text" 命令。
  • 当您的线路是12 时,您预计如何区分使用的格式'(A)''(2I1)''(I2)'
  • 我必须从输入文件中读取所有行并确定我需要什么信息。有些行很容易通过内容(标题、表格的结尾行等)来识别,但其他行则不那么容易。
  • 问题已编辑
  • 将该行读入字符串。选择格式1。尝试对格式1下的字符串进行内部读取。如果成功则拍拍自己的背,喝啤酒继续计算。如果失败,请选择格式 2。尝试对格式 2 下的字符串进行内部读取,...。

标签: string file fortran format


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我相信我的描述根本不清楚。我无权修改生成输入文件的程序。
    【解决方案3】:

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

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

    【讨论】:

    • READ(*,*) line 不会非常有用。此外,从问题来看,读取可能会在没有错误的情况下完成,但仍然会产生不良影响。
    • 如果你想读一整行,你需要一个格式描述符。READ(*,'(a)') line
    • 是的,本案最大的问题在于francescalus 所说的。我想我必须找到另一个解决方案。
    【解决方案4】:

    通过混合发布的一些建议解决了问题。 我以“(A165)”格式读取内部变量(RLINFILE)中输入文件的每一行。之后,我使用我知道的行的格式读取了我在几个虚拟变量中放入这个内部变量的字符串的所有内容(读取所需行的所有信息)并得到 IOSTAT = 0 保证这是正确的行),所以如果读取的结果是 ok (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)
    

    【讨论】:

      猜你喜欢
      • 2013-04-16
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 2019-09-20
      相关资源
      最近更新 更多