我正在尝试创建一个函数,它接受文件名(即“data.txt”)并生成该文件的行数。
data.txt :
24 42
45 54
67 76
89 98
12 21
99 99
33 33
下面的代码是我尝试构建一个函数,该函数接受文件名“data.txt”并生成文件的行数。代码的第一部分(第 1-12 行)是定义函数,第二部分(第 14-19 行)是我在程序中调用函数的地方。以下代码的输出是 1 而不是 7(查找 - data.txt 有 7 行)。
function count_lines(filename) result(nlines)
character :: filename
integer :: nlines
open(10,file=filename)
nlines = 0
do
read(10,*,iostat=io)
nlines = nlines + 1
if (io/=0) exit
end do
close(10)
end function count_lines
program myread
integer :: count_lines
print *, count_lines("data.txt")
end program myread
尝试调试:
我认为这与 do 循环不起作用有关,但我不确定。我已将 if 语句更改为if (io>0)
这给出了输出2
,我不明白。目前,当我编译错误的输出时,我没有收到错误输出。
filename
(虚拟参数)只有一个字符长。如果您提供更长的时间,任何事情都可能发生(但通常是有上限的)。
这不会导致错误,因为您没有指定status
文件的,甚至检查操作是否成功(事实上,您刚刚创建了一个新文件d
)。
您可以通过使用假定长度的字符串来避免这种情况:
function count_lines(filename) result(nlines)
character(len=*) :: filename
! ...
open(10,file=filename, iostat=io, status='old')
if (io/=0) stop 'Cannot open file! '
function count_lines(filename) result(nlines)
implicit none
character(len=*) :: filename
integer :: nlines
integer :: io
open(10,file=filename, iostat=io, status='old')
if (io/=0) stop 'Cannot open file! '
nlines = 0
do
read(10,*,iostat=io)
if (io/=0) exit
nlines = nlines + 1
end do
close(10)
end function count_lines
[增量after检查以确保正确的行数。]
对于你问题的第二部分:
正(非零)错误代码对应于除IOSTAT_END
(文件结尾)或IOSTAT_EOR
(记录结束)。在第一轮循环中读入(新)文件后(io==IOSTAT_END
,我检查了我的编译器),你试图读到最后......这会导致一个正错误。由于增量发生before退出循环,最终值是2
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)