如何从带有Fortran 77描述和空行的文件中读取数据?

时间:2015-11-08 22:18:07

标签: fortran fortran77

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

另外,我的代码有没有办法计算包含我在该文件中感兴趣的数据的行数?或者我是否必须手动计算它们来构建我的do循环来读取数据?

我试图在网上和Schaum的使用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

我假设这个问题非常基本,但我现在已经和它斗争了一段时间,所以我想我会问。

3 个答案:

答案 0 :(得分:1)

自从我查看F77代码已经很长时间了,但一般来说,如果你在DO循环中的read语句可以处理查找空行,甚至是只包含空格的记录,那么你可以编写逻辑捕获这种情况并进入休息或继续声明。我只是不记得读取是否可以智能地处理这种情况。

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

这样的东西

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

答案 1 :(得分:1)

如果您知道不需要/想要阅读的行,您可以通过调用read来推进IO,而无需输入项目。

您可以使用:

read(input-unit,*)

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

答案 2 :(得分:1)

看起来应该是这样的: -

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

所以我使用经典的格式化读取来读取标题行,然后使用自由格式来读取数字。带有星号的自由格式读取会跳过包含空白行的空白行,以便它可以执行您想要的操作,当没有更多数据时,它将转到语句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