文本文件的行数

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(使用前将#替换为@)

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

  • 在 Fortran 中写入现有文件而不覆盖

    我有一个由 Fortran 程序编写的现有文件 已格式化 我想在文件开头添加几行 我们的想法是在不复制原始文件的情况下完成此操作 我可以在文件末尾添加一行 open 21 file myfile dat status old action
  • 与 gfortran 和 gcc 静态链接的混合语言

    我有一些用 C 和 Fortran 编写的代码 我想将其编译成静态链接的可执行文件 如果我动态编译代码 使用 fno underscoringgfortran 的选项 一切正常 但是 我想将其链接到 so文件中 静态链接大部分需要的库 然后
  • Fortran + OpenMP + 多态性:到底不支持什么?

    我知道 OpenMP 4 5 标准表示 Fortran 中不支持 多态实体 这到底是什么意思 这是否仅排除对具有 PASS 属性的类型绑定过程的调用 但我仍然可以以其他方式使用具有类型绑定过程的用户定义类型的实例 例如访问其组件 此限制是否
  • fortran 中的多重定义链接错误(ifort - gfortran)

    嗯 我有这个问题 描述很长 但我认为很容易解决 我有三个文件 nrtype f90 它有一些愚蠢的定义 但它被以下文件使用 module nrtype integer parameter I4B SELECTED INT KIND 9 in
  • 如何在 makefile 中定义变量,然后在 Fortran 代码中使用它

    我试图在 makefile 中定义一个变量 然后根据是否设置了该变量 更改在我的 Fortran 例程中编译的代码块 简单的例子我无法工作 program test implicit none integer a ifdef MYVAR a
  • 定义派生类型数组

    我正在尝试使用参数声明初始化派生类型 当我编译时 出现以下错误 1 处的 INTEGER 4 数组构造函数中的元素是 CHARACTER 1 用户定义的种类值ip and dp被发现于fasst global 他们是 integer par
  • 循环变量文件名[重复]

    这个问题在这里已经有答案了 我正在使用 Fortran 对分成许多文件的庞大数据集进行计算 文件的名称是 maltoLyo12per reimage set1 traj maltoLyo12per reimage set2 traj mal
  • 在 Fortran 90 中,是否必须事先声明数组维度?

    是否有必要在任何其他代码之前声明数组维度 例如 我编写了以下简化的示例代码 PROGRAM mytest IMPLICIT NONE INTEGER i j k mysum Let array c be a k by k 2 array D
  • Fortran 中指数函数的 DEXP 或 EXP?

    我有两个非常简短的问题 1 我刚刚读到DEXP is the archaic的形式EXP 这是否意味着不应再使用它 我一直以为DEXP 双精度等于EXP 2 指数函数的范围是多少 它依赖于编译器吗 问题 1 在现代 Fortran 中 最好
  • 在 Fortran 中读取行数已知但每行条目数未知的数据文件

    如何读取包含已知行数但每行中的条目数未知的数据文件 例如如果我的数据文件包含类似的内容 1 3 4 5 6 7 8 9 1 3 5 6 4 5 6 7 8 3 5 6 7 8 4 5 7 8 即三行 但每行中的数据未知 有一次我需要来自一行
  • OpenMP 因大型数组而崩溃

    我正在使用 Fortran 和 OpenMP 但当我尝试在存在大型数组时使用 OpenMP 并行化循环时 我不断遇到问题 例如 以下代码 PROGRAM main IMPLICIT NONE INTEGER PARAMETER NUMLOO
  • 时间数组在建模中超出范围?

    这些天我正在尝试使用新的气象数据 以 netcdf 格式而不是旧的 cray 格式给出 运行我的气候模型 模型编译顺利 但是当进行模拟时 模型在第一天运行良好 但在模拟的第二天就停止了 总是在同一时间步长 无论我使用哪个开始日期 错误是 f
  • Fortran 03/08(gfortran 编译器)中使用无限多态类型进行数组操作

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

    在 fortran 90 中 if stop 语句是否需要结束 endif example if foo eq 1 stop do some stuff do some stuff 是循环的一部分还是 stop 意味着程序结束时 endif
  • 纯 Fortran 过程中的 I/O

    我正在尝试将错误检查合并到我正在编写的纯过程中 我想要这样的东西 pure real function func1 output unit a implicit none integer a output unit if a lt 0 th
  • 如何将mortran代码转换为fortran代码

    我有一些 Mortran 代码 来自 glmnet 我想阅读和编译 我知道在编译时 Mortran首先转换为Fortran 然后编译 如果有预处理器的话 如何安装 Mortran 预处理器 特别是 OS X 上的 Mortran3 我在以下
  • 指定 gfortran 应该在其中查找模块的目录

    我目前基于模块来编译程序 例如主程序foo这取决于模块bar 如下 gfortran c bar f90 gfortran o foo exe foo f90 bar o 当foo f90 and bar f90位于同一目录中 如何指定 g
  • 在一条语句中对多个变量进行相同的赋值

    有没有一种方法可以为不同的变量分配相同的值 而无需在单个语句中构造数组 例如 如果我有变量a b c d and e 我可以分配类似的东西吗 a b c d e 10 0 我知道我可以用一行来做 a 10 0 b 10 0 c 10 0 d
  • 有没有一种简单的方法来准备 Fortran 代码以进行并行调用

    我想使用 OpenMP 在 C 程序中并行求解多个大型 ODE 系统 由于某些原因 我需要使用 ODE 求解器 但我只能找到 Fortran 90 子例程 而且代码太大 无法简单地将其转换为 C 我知道 Fortran 广泛使用静态内存 因
  • forrt1:严重(170):程序异常 - 堆栈溢出

    并提前感谢您的帮助 我已经编译了一个程序 不是我编写的 它在 Mac 上运行得很好 但是当我尝试在 Windows 上执行该程序时 在程序开始执行后不久 我收到以下错误消息 forrt1 严重 170 程序异常 堆栈溢出 我不是 ifort

随机推荐