文本文件的行数

2023-12-08

我正在尝试创建一个函数,它接受文件名(即“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(使用前将#替换为@)

文本文件的行数 的相关文章

  • 不确定 openmp 循环中应该共享或私有什么

    我有一个更新矩阵 A 的循环 我想将其设为 openmp 但我不确定哪些变量应该共享和私有 我本以为只有 ii 和 jj 就可以工作 但事实并非如此 我想我也需要在某个地方进行 OMP ATOMIC UPDATE 该循环仅计算 N 和 N
  • Fortran:向文件添加列(即跳过不同数量的水平空格)

    我是 Fortran f90 的初学者 一些看似简单的问题结果却导致严重头痛 感谢您帮助我解决这个问题 我的代码运行一个循环 处理数据并将它们写入文件 我希望将这些数据写入同一文件的列中 直到循环完成 OPEN unit 11 file f
  • 时间数组在建模中超出范围?

    这些天我正在尝试使用新的气象数据 以 netcdf 格式而不是旧的 cray 格式给出 运行我的气候模型 模型编译顺利 但是当进行模拟时 模型在第一天运行良好 但在模拟的第二天就停止了 总是在同一时间步长 无论我使用哪个开始日期 错误是 f
  • Fortran 2003,选择类型以区分“实数”和“实数数组”

    我的问题是 可以select type用块来区分real realInput from real realArrayInput 很清楚如何select type可以用于区分派生类型 但对我来说不太清楚它如何 或是否 可以用于内在类型 在 M
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

    我想通过以下方式实现有用的数组操作 添加元素 删除元素 通过可分配 指针 二叉树结构实现不同的实现 class 特征 无限多态性 我使用 gfortran 5 0 应该可以处理这样的功能 我需要它 以免为我使用的每种类型重复相同的代码 这应
  • Fortran PURE 函数可以使用全局参数吗?

    在我看来 Fortran 中所谓的纯函数对于那些使用函数式编程的人来说似乎不够纯粹 这是我的问题 假设我有以下代码 MODULE basics IMPLICIT NONE INTEGER PARAMETER dp kind 1 0d0 RE
  • gfortran 未定义的引用

    我正在尝试编译一个依赖很多东西的程序 我使用并修改了提供的 makefile 来代表我的计算机设置 但在编译的最后一步中我不断收到许多未定义的引用 导致问题的命令行是 gfortran o cosmomc ParamNames o Matr
  • Fortran 中的数组第一个索引

    我认为 Fortran 中数组的第一个索引是 1 但是为什么这段代码可以工作呢 代码是 Wavewatch 的修改部分 http polar ncep noaa gov waves wavewatch http polar ncep noa
  • 如何在Fortran代码中将二维数组转换为一维数组?

    如何将 r i j 转换为一维数组以便可以轻松地对数字进行排序 program sort implicit none character CN 8 O 7 integer j iconf nconf integer i nbins t in
  • f951 错误:无法识别的命令行选项

    我在linux上 正在编译以下内容 mpif90 shared source F90 object1 o object2 o L some path Qoption link rpath some path I some path lhdf
  • gfortran 支持尾调用消除吗?

    我编写了这个小程序来测试 gfortran 是否执行尾调用消除 program tailrec implicit none print tailrecsum 5 0 contains recursive function tailrecsu
  • 如何格式化整数以仅具有所需的大小?

    我一直在尝试以下代码 program hello write i9 10 end program hello 并改变格式字符串 尝试使写入输出的字符串大小恰好满足表示整数所需的大小 但到目前为止我无法管理它 如何在 Fortran 中编写
  • Fortran 递归分段错误

    我必须设计并实现一个 Fortran 例程来确定方格上簇的大小 并且递归地编写子例程似乎非常方便 然而 每当我的晶格大小超过某个值 大约 200 边 时 子例程就会始终出现段错误 这是我的集群检测例程 RECURSIVE SUBROUTIN
  • Fortran 内部计时例程,哪个更好? cpu_time 或 system_clock

    当对 FORTRAN 程序进行计时时 我通常只使用命令call cpu time t 然后我偶然发现call system clock count count rate count max 这似乎做了同样的事情 然而 在更加困难的庄园里 我
  • 这些双精度值如何精确到小数点后 20 位?

    当精度是一个问题时 我正在测试一些非常简单的等价错误 并希望以扩展双精度执行操作 这样我就知道答案在 19位数字中 然后以双精度执行相同的操作 其中第 16 位会有舍入误差 但不知何故 我的双精度算术保持了 19 位精度 当我在扩展双精度中
  • 在 fortran 子例程中包含 c/c++ 头文件

    我有一个用 C C 编写的库 其开发人员声明该库具有 Fortran 接口 该接口将被启用 包括头文件 h 并调用经典子例程 我想编译我的 Fortran 程序并链接该库 该库已经过测试并且可以工作 这是主程序 Main program I
  • Fortran :: (1) 处 OPEN 语句中存在语法错误

    我试图通过 顽固测试 来测试我的密码算法 http stat fsu edu pub diehard http stat fsu edu pub diehard 我意识到我的输入文件必须是未格式化的直接访问文件 所以我尝试用 Fortran
  • 将 FORTRAN 对象传递给 C,反之亦然

    我有我的 Fortran 对象 即 this object a this object b this object c 我想将它传递给用 C 编写的代码 我主要是一名 FORTRAN 程序员 而且我很少接触 C 我正在使用iso c bin
  • Fortran 指针数组

    同样 Fortran 中的指针数组 好吧 我有一个派生类型 type t context pointer type t context pointer p ctx end type t context pointer 当我在主程序中执行以下
  • 用于稀疏矩阵的 Fortran 90/95 库?

    我正在寻找一个用于处理 Fortran 90 95 中稀疏矩阵的库 我只需要非常基本的运算 例如矩阵向量乘法 你建议我用什么 我搜索了一下 找到了 BLAS 的一个扩展 称为 稀疏 blas 记录在blast技术论坛规范的第 3 章中 ht

随机推荐