在fortran中读取可变长度的实际值

问题描述 投票:1回答:2

我有一个文件,其中包含以下文字:

-1.065211      246.0638 xlo xhi
-0.615       245.385 ylo yhi
-10 10 zlo zhi

我想将线上的数值读成3 * 2的实矩阵。 是否可以只读取记录的两个输入并转到下一行?就像是: read(1,'(2F?.?/)') (matrix(i,1:2),i=1,3) 我在F?中加了问号?因为我的数字长度是可变的。换句话说,我只需要以自由格式读取记录的两个项目。我知道你可以通过一个循环来做到这一点。我想知道是否有可能是一个单线班轮。

io fortran fortran90 fortran77
2个回答
2
投票

你可以实现你想要的

do i = 1, 3
   read(fd,*) matrix(i,:)
end do

假设fd连接到包含您的数据的文件。


0
投票

@ Steve的答案中的代码是最简单的,可以完成你想要的。如果你想要它在一行,你可以简单

do i=1,3 ; read(fd,*) matrix(i,:) ; end do

如果您正在寻找的只是“仅读取一条记录的两个输入并转到下一行”的方法,只有一个语句,据我所知,不可能:由于您的真实值具有不同的格式,您需要使用列表导向的输入(格式中的星号),以便使用相同的语句读取多行(所有其他格式的reals需要一个正宽度的输入,并且由于你的实际有不同的宽度,任何宽度规格都会产生在运行时错误)。

如果你只想使用一个语句,你需要明确告诉程序读取每行末尾的两个字符串,即使它们被丢弃(否则程序会尝试将字符串运行为实数,并且这将导致运行时错误):

character(len=10) :: r
read(1,*) (a(i,:),r,r,i=1,3)

这不像@Steve的代码那样通用(要求每行只有2个字符串),实际上需要额外声明字符变量。

最后,请注意,您不是按元素顺序读取数组:在Fortran中,内存中数组元素的顺序是a(1,1)a(2,1)a(3,1)a(1,2)等。如果您计划操作的实际数组是更大,索引的顺序可能会显着影响性能,因为您的连续内存访问可能会解决内存的远端部分而不是连续的部分。当您在Fortran中编写程序时,与任何其他语言(可能使用不同的顺序)一样,您需要考虑数组索引的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.