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

时间:2018-06-11 18:26:47

标签: io fortran fortran90 fortran77

我有一个包含以下文字的文件:

-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?中加了问号?因为我的数字长度是可变的。换句话说,我只需要以自由格式读取记录的两个项目。我知道你可以通过一个循环来做到这一点。我想知道是否有可能是一个单线班轮。

2 个答案:

答案 0 :(得分:2)

你可以用

达到你想要的效果
do i = 1, 3
   read(fd,*) matrix(i,:)
end do

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

答案 1 :(得分: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中编写程序时,与任何其他语言(可能使用不同的顺序)一样,您需要考虑数组索引的顺序。