【问题标题】:Fortran, How do I get Fortran to ignore lines from a data file that has random spacingFortran,如何让 Fortran 忽略具有随机间距的数据文件中的行
【发布时间】:2012-05-14 12:18:38
【问题描述】:

我正在编写一个 FORTRAN 代码,该代码使用 MD 程序生成的文件中的数据。数据是一个值列表,但在表单中的列表更新数据中有中断(# Neighbor list update .. 6527 个索引在列表中),这些中断是随机间隔的,所以我不能跳过每个 x

我在编写代码时不会忽略这些行并随机添加上一步的值。

1、0.98510699999999995、0.98510699999999995
2、1.9654170000000000、0.98031000000000001
3、2.9427820000000002、0.97736500000000004
4、3.9186540000000001、0.97587199999999996
4、4.8945259999999999、0.97587199999999996
5, 5.8697910000000002, 0.97526500000000005
注意双步 4 与真正的步 4 具有相同的值

我将如何跳过这一行。请在下面找到示例代码

Open(Unit=10,File='prod._100.tup')

do i=1,50

Read(10,*,IOSTAT=ios)step,temp,kinetic,potential,total,pressure
If(IS_IOSTAT_END(ios)) Exit
test=test+temp
print*, step, test, temp
End Do

【问题讨论】:

    标签: input fortran skip


    【解决方案1】:

    我不清楚文件中的“中断”是什么。它们是空行吗?如果是这样,下面的代码应该可以工作:

    use, intrinsic :: iso_fortran_env
    
    character (len=200) :: line
    
    Open(Unit=10,File='prod._100.tup')
    
    read_loop: do
    
       Read (10,'(A)',IOSTAT=ios) line
       If(ios == iostat_end) exit read_loop
       if (len_trim (line) == 0) then
          write (*, *) "blank line"
          cycle read_loop
       end if
       read (line, *) step,temp,kinetic,potential,total,pressure
       test=test+temp
       print*, step, test, temp
    
    end do: read_loop
    
    write (*, *) "total is", test
    

    以上内容未经测试。 “len_trim”测试基于空行的不良记录。如果以其他方式定义中断,则必须创建不同的测试。

    【讨论】:

      【解决方案2】:

      试试:

      i=1
      do while (i<=50)
        Read(10,*,IOSTAT=ios)step,temp,kinetic,potential,total,pressure
        If(IS_IOSTAT_END(ios)) Exit
        IF(ios.ne.0) cycle
        test=test+temp
        i=i+1
      enddo
      

      当读取坏记录时,ios 被分配一个系统相关的非零数字(成功时为零)。显然您已经编写了一个函数 (IS_IOSTAT_END) 来判断您是否已到达文件末尾,但可能存在其他错误情况(例如,读取语句与数据不匹配)。这将返回与结束文件记录不同的非零 ios,因此您应该在该点重新启动循环(例如cycle

      我假设您想从文件中准确读取 50 行,因此我将您的 do 循环更改为 do while,但如果您读取的记录数实际上并不重要,请随意更改它返回。

      【讨论】:

        猜你喜欢
        • 2021-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-30
        • 2018-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多