如何使用 Fortran 77 从包含描述和空行的文件中读取数据?

How do I read data from a file with description and blank lines with Fortran 77?

我是 Fortran 77 的新手。我需要将给定文本文件中的数据读取到两个数组中,但是在包含数据的行之前,有些行要么是空白的,要么包含关于数据集的描述性信息我需要读书。如何跳过这些行?

此外,我的代码是否可以计算该文件中包含我感兴趣的数据的行数?或者我是否必须手动计算它们以构建我的 do-loops 来读取数据?

我试图在网上和 Schaum 的 Programming with Fortran 77 中找到示例,但找不到太具体的内容。

我需要从下面读取数据的部分文件。我需要用每列下的条目构建一个数组。

    Data from fig. 3 in Klapdor et al., MPLA_17(2002)2409

    E(keV)  counts_in_bin

    2031.5  5.4

    2032.5  0

    2033.5  0

我假设这个问题是非常基础的,但我已经纠结了一段时间,所以我想我会问。

我已经有很长时间没有看过 F77 代码了,但一般来说,如果您在 DO 循环中的读取语句可以处理查找空行,甚至是只包含空白的记录,那么您可以编写捕获该条件并转到 break 或 continue 语句的逻辑。只是不记得 read 是否可以智能地处理这种情况。

或者,如果您使用的是 UNIX shell 和 coreutils,您可以使用 sed 删除空行,/^$/ 或 /^ *$/ 在将文件发送到 F77

之前预处理文件

类似

$ sed infile -e 'd/^$/;d/^ *$/' > outfile

如果您知道您不 need/want 阅读的行在哪里,您可以通过调用 read 来推进 IO,无需输入任何项目。

您可以使用:

read(input-unit,*)

从您的输入文件中读取一行,丢弃其内容并将 IO 推进到下一行。

它应该看起来像这样:-

C       Initialise
    integer i
    character*80 t1,t2,t3
    real*8 x,y
    open(unit=1,file='qdata.txt')   
C       Read headers    
    read(1,100)t1
100 format(A80)
    write(6,*) t1
    read(1,100)t2
    write(6,*) t2
    read(1,100)t3
    write(6,*) t3
    write(6,*)

C       Read data
    do 10 i=1,10
    read(1,*,end=99) x,y
    write(6,*) x,y
10  continue
99  continue
    end

所以我使用了经典格式的阅读来阅读 header 行,然后 free-format 来阅读数字。带星号的 free-format 读取会跳过白色 space 包括空行,因此它会执行您想要的操作,当没有更多数据时,它将转到语句 99 并完成。

输出如下所示:-

     Data from fig. 3 in Klapdor et al., MPLA_17(2002)2409                       

     E(keV)  counts_in_bin 

   2031.5000000000000        5.4000000000000004     
   2032.5000000000000        0.0000000000000000     
   2033.5000000000000        0.0000000000000000