【问题标题】:Skip a line from text file in Fortran90在 Fortran90 中从文本文件中跳过一行
【发布时间】:2011-08-02 11:19:21
【问题描述】:

我正在用 fortran (90) 编写。我的程序必须读取 file1,对它的每一行执行一些操作并将结果写入 file2。但问题是 - file1 在第一行有一些不需要的信息。

如何使用 Fortran 从输入文件中跳过一行?

代码:

open (18, file='m3dv.dat')
open (19, file='m3dv2.dat')
do
  read(18,*) x
  tmp = sqrt(x**2 + 1)
  write(19, *) tmp
end do

第一行是文本和数字的组合。

【问题讨论】:

    标签: fortran fortran90


    【解决方案1】:

    您已经找到了解决方案,但我只是想补充一点,您甚至不需要虚拟变量,在进入循环之前只需一个空白的读取语句就足够了:

    open(18, file='m3dv.dat')
    read(18,*)
    do
        ...
    

    其他答案是正确的,但这可以提高代码的简洁性和(从而)可读性。

    【讨论】:

    • 谢谢,我没有意识到这一点。
    • @osgx 是的。如果要跳过 3 行,就写三遍。
    【解决方案2】:

    在 do 循环之前执行读取操作,将第一行中的任何内容读入“虚拟”变量。

    program linereadtest
    implicit none
    character (LEN=75) ::firstline
    integer :: temp,n
        !
        !
        !
    open(18,file='linereadtest.txt')
    read(18,*) firstline
    do n=1,4
       read(18,'(i3)') temp
       write(*,*) temp
    end do
    stop
    end program linereadtest
    

    数据文件:

    这是对 1000 件事情的测试,其中 10 其中不存在

    50
    100
    34
    566
    

    !忽略行和数字之间的空格,我无法格式化

    【讨论】:

    • 如何在 fortran 中读取whatever?第一行有几个空格分隔的字符串和数字。
    • 创建一个字符数组(LEN=100,或其他)。我相信read 应该读到行尾。
    【解决方案3】:
    open (18, file='m3dv.dat')
    open (19, file='m3dv2.dat')
    read(18,*) x // <---
    
    do
      read(18,*) x
      tmp = sqrt(x**2 + 1)
      write(19, *) tmp
    end do
    

    添加的行只是读取第一行,然后在第一次迭代时用第二行覆盖它。

    【讨论】:

    • 我认为你的假设文件第一行的信息与第二行的类型相同。
    • @jonsca:是的,我认为,除非其他人声称。
    • 不,第一行不是单个数字,而是数字和文本的组合
    • 所以你最好将第一行读入一个适当长度的字符数组,否则你会得到一个运行时错误,我相信(假设从第 2 行开始是integersdouble precision等)
    • @suddnely_me Fortan 中没有 '\0'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多