0

我正在尝试读取一个文件,将每一行放入一个名为 row 的变量中,然后从该行中获取某些位置的值并将其放入另一个变量中。然后应该写入文件。你是怎样做的?

program read_block
implicit none
real :: x,y
integer :: ios
character(len=100) :: row

open(unit=101, file='block2trimmed.gro',action='read',status='old')
open(unit=102, file='readoutput.gro', action='write',status='new')
do
read(101, '(i5,2a5,i5,3f8.3,3f8.4)',iostat=ios) row
if (ios /= 0) exit
read(row(21:28),*) x
read(row(29:36),*) y


write(102,*) x , y
end do
close(101)
close(102)
end program read_block
4

1 回答 1

1

OP 似乎混合了两种不同的读取文件的方法,其中任何一种都可以,但不能同时使用。

可以读取整行文本(进入row变量),然后将其分成单独的数据字段(使用read(row(21:28),*) x和类似)。或者可以根据需要将单独的字段直接读取到变量中,使用格式告诉代码在哪里可以找到每一行的各个项目。对于.gro文件,请使用后一种方法。文件中的行以格式中指定的方式精心布置。

这条线

read(101, '(i5,2a5,i5,3f8.3,3f8.4)',iostat=ios) row

小心地告诉编译器阅读

  • 5 个字符宽的字段中的整数;

  • 两个字符串,每个 5 个字符;

  • 5 个字符宽的字段中的另一个整数;

  • 3 个实数,来自 8 个字符的字段,小数点后 3 位;和
  • 3 个实数,来自 8 个字符的字段,小数点后 4 位;

然后告诉它把它们全部塞进一个 100 个字符的字符串中,称为row. 当它试图将字符串解析回单独的元素时,这有点疯狂,甚至更疯狂。扔掉那条线并用类似的东西代替它:

read(101, '(i5,2a5,i5,3f8.3,3f8.4)',iostat=ios) int1, str1, str2, int2, r1, r2, r3, r4, r5, r6

为此,您必须声明所有这些变量,并且您可能希望给它们起更有意义的名称。如果您只对某些变量感兴趣,请忽略其他变量。

可以将这一行读入字符串row,然后将其拆开,但需要另外 10 行代码才能实现这一行的功能,并且row完全省去。Gromos.gro文件旨在易于阅读,因此请轻松阅读。

至于把它们写出来,正确的方法取决于你接下来要对数据做什么,但行

write(102,*) int1, str1, str2, int2, r1, r2, r3, r4, r5, r6

快速简便,尽管它可能不是您所需要的。

于 2020-06-11T14:30:15.680 回答