如何使用 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
我是 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