gpt4 book ai didi

fortran - 文本文件的行数

转载 作者:行者123 更新时间:2023-12-05 02:21:42 29 4
gpt4 key购买 nike

我正在尝试制作一个接受文件名(即“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

[在检查后增加以确保正确的行数。]


对于你问题的第二部分:

正(非零)错误代码对应于 IOSTAT_END(文件结束)或 IOSTAT_EOR(记录结束)以外的任何错误。在第一轮循环中读入(新)文件后(io==IOSTAT_END,我用我的编译器检查过),你试图读到最后......这导致正误差。由于增量发生在您退出循环之前,因此最终值为2

关于fortran - 文本文件的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32682309/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com