为什么fortran不读取一行并写入文件?

为什么fortran不读取一行并写入文件?,fortran,row,write,Fortran,Row,Write,我试图读取一个文件,将每一行放入一个名为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='reado

我试图读取一个文件,将每一行放入一个名为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

OP似乎混合了两种不同的读取文件的方法,这两种方法都可以,但不能同时使用

可以将整行文本读入row变量,然后使用readrow21:28、*x和类似工具将其分离到单独的数据字段中。或者,您可以根据需要将单独的字段直接读入变量,使用该格式告诉代码在哪里可以找到每行上的各个项目。对于.gro文件,使用后一种方法。文件中的行按格式中指定的方式仔细排列

这条线

read(101, '(i5,2a5,i5,3f8.3,3f8.4)',iostat=ios) row
仔细地告诉编译器阅读

5个字符宽字段中的整数

两个字符串,每个字符串有5个字符

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

3个实数,来自8个字符的字段,小数点后有3位数字;和 3个实数,来自8个字符的字段,小数点后4位; 然后告诉它把它们都塞进一个名为row的100个字符的字符串中。这有点疯狂,当它试图将字符串解析回单独的元素时,甚至更疯狂。扔掉那条线,换上类似的东西:

read(101, '(i5,2a5,i5,3f8.3,3f8.4)',iostat=ios) int1, str1, str2, int2, r1, r2, r3, r4, r5, r6
为了实现这一点,您必须声明所有这些变量,并且您可能希望为它们指定更有意义的名称。如果你只对其中一些变量感兴趣,那么忽略其他变量

可以将该行读入字符串行,然后将其分开,但需要另外10行代码才能实现该行的功能,并且完全不需要行。Gromos.gro文件是为方便阅读而设计的,因此可以轻松阅读

至于把它们写出来,正确的方法取决于你下一步想对数据做什么,而不是行

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

虽然它可能不是您所需要的,但它快速而简单。

您可能会从编译器或在运行时遇到错误。请出示。但是,我看到您正试图用i5读入字符行:这行不通。