【发布时间】:2018-11-08 18:20:24
【问题描述】:
我正在尝试读取如下所示的 .gro 文件:
1coh C 1 0.206 -0.049 0.429
1coh O1 2 0.295 0.048 0.501
1coh H3 3 0.252 -0.137 0.424
1coh H4 4 0.186 -0.014 0.337
我需要将0.206、-0.049、0.429 存储到数组中。
我用它来识别行中的coh:
open(unit=20,file=grofile2)
do i=1,3
read(20,'(A)')line
lname2=line(6:8)
enddo
close(unit=20)
然后,使用以下命令读取特定行:
open(unit=20,file=grofile2)
150 read(20,'(A)',end=151)line
if(line(6:8).eq.lname2)then
i=i+1
lig2(i)=line
write(*,*)lig2(i)
endif
goto 150
151 continue
close(unit=20)
natoms2=i
这里的write 确实将行正确输出到终端。
然后我跟着这个:
do j=1,natoms2
write(*,*) j
write(*,*) lig2(j)
read(lig2(j)(23:28),*)lig2x(j)
read(lig2(j)(31:36),*)lig2y(j)
read(lig2(j)(39:44),*)lig2z(j)
write(*,*) lig2x(j),lig2y(j),lig2z(j)
enddo
将单个值读取到这些数组中。
此时我得到错误:
At line 145 of file samgen.f
Fortran runtime error: Bad real number in item 1 of list input
第 145 行是:read(lig2(j)(23:28),*)lig2x(j)
此语法在其他程序中适用于该文件,但在此处不起作用。我尝试在读取行中使用F6.3 而不是*。我检查了变量声明和类型。我究竟做错了什么?有任何想法吗?或者可能是更好的阅读方式?
【问题讨论】:
-
你检查过
lig2(j)(23:28)的值吗? -
i在150 read(...行之前的值是多少。因为如果之前不是 0(可能是 3,因为你之前在 do 循环中使用了它),那么lig2(1)不会被赋值,这将很难从中读取浮点值。 -
是的,第一个输入行的第 23 到 28 列看起来像:'06 -0'。这不是一个有效的数字。我熟悉 .gro 文件。您可以控制输出精度并更改格式,因此该程序可以在 1 个 .gro 文件上运行,但不能在另一个文件上运行。
标签: io fortran runtime-error