0

我正在编写一个 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
note the double step 4 with an identical value from the true step 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
4

2 回答 2

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”测试基于空行的不良记录。如果以其他方式定义中断,则必须创建不同的测试。

于 2012-05-05T01:03:51.500 回答
0

尝试:

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循环更改为 a do while,但如果您读取的记录数实际上并不重要,那么请随时将其更改回来。

于 2012-05-05T00:31:30.190 回答