【问题标题】:why won't fortran read a row and write to file?为什么fortran不会读取一行并写入文件?
【发布时间】:2020-10-01 03:26:40
【问题描述】:

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

【问题讨论】:

  • 您可能会从编译器或运行时收到错误。请证明这一点。但是,我看到您正试图用i5 读入字符row:这是行不通的。

标签: fortran row write


【解决方案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 位;

然后告诉它把它们全部塞进一个名为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

快速简单,但可能不是您需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2012-12-29
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多