在Fortran中读取包含(大)N实数的行到数组

时间:2010-07-12 00:23:53

标签: arrays fortran io

我已经读过()过了输入文件的标题,并在途中读取了L的值。

现在我来了一行L ^ 2连续实数,我需要输入到可分配数组A(L,L)的元素。

尝试

          character *100 :: buffer
          read (1,10) buffer
10      format(a(L*10))

结果

Error: Syntax error in FORMAT statement at (1)  
Error: FORMAT label 10 at (1) not defined

但我不确定如何处理(大量)可变数量的实数。

尝试:

    do i=1,L
    do j=i,L
        read (1,"(f10.7)") buffer
        read (buffer,*) A(i,j)
    enddo
    enddo

抛出:

Fortran runtime error: Expected REAL for item 2 in formatted transfer, got CHARACTER
    (f10.7)

我不能简单地阅读(1,“(a1000)”)因为L最终会变得巨大,所以我真正需要的是一种逐一解析元素的方法。

请说有办法吗?

3 个答案:

答案 0 :(得分:3)

处理完标题后,或许通过将其读入字符串并解析字符串来做“奇特”的事情,为什么不直接从文件中读取数字并跳过字符“缓冲区”?

“read(unit,*)A”被称为“list-directed IO” - 如果你想知道要搜索或查找的内容 - 对我来说这似乎是一个很好的方法。它非常灵活 - 您不必担心将数字精确对齐到列中。如果您只是读入数组“A”,则元素将以Fortran数组元素顺序读取。

在Fortran 2003中,您可以使用“*”作为变量格式重复说明符:read(unit,'(*(F10.7))')。但是,目前还没有很多编译器支持这一点。这个最简单的事情就是使用一个巨大的值,比你需要的更大 - 当列表中没有更多项目要读取时,读取将停止 - 允许重复说明符超过项目数量读取。

答案 1 :(得分:0)

这是你在找什么?

http://www.tek-tips.com/viewthread.cfm?qid=1420862&page=1

更新

http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/chap05/format.html http://rainbow.ldgo.columbia.edu/data/fortranreaddata.html

这超过了未格式化的记录长度读数。自从我不得不捣乱fortran I / O以来,已经有很长一段时间了。我很确定OPEN或READ有一个标志,它指定它不应该继续到下一行,而是保持文件指针到位,以便下一个READ可以从那里开始。但我不记得了它......

答案 2 :(得分:0)

哈哈,这似乎有效:

read (1,*) A
write (*,*) A

似乎标准知道它在做什么,即使我没有。