我正在尝试读取一个文件,将每一行放入一个名为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
发布于 2020-06-11 14:30:16
OP似乎混淆了两种不同的读取文件的方法,这两种方法中的任何一种都可以工作,但不能同时使用两种方法。
您可以读取整行文本(放入row
变量),然后将其拆分到单独的数据字段中(使用read(row(21:28),*) x
或类似方法)。或者,可以根据需要将单独的字段直接读取到变量中,使用格式告诉代码在哪里可以找到每一行上的各个项。对于.gro
文件,使用后一种方法。文件中的行按照格式中指定的方式进行了仔细的布局。
这一行
read(101, '(i5,2a5,i5,3f8.3,3f8.4)',iostat=ios) row
小心地告诉编译器要读取
然后告诉它将它们都塞进一个名为row
的100个字符的字符串中。这有点疯狂,当它试图将字符串解析回单独的元素时甚至更疯狂。去掉这一行,代之以下面这样的代码:
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
是快速而简单的,尽管它可能不是您所需要的。
https://stackoverflow.com/questions/62325175
复制相似问题