代码之家  ›  专栏  ›  技术社区  ›  Samizdis

在Fortran中,将包含(大)N个实数的行读入数组

  •  0
  • Samizdis  · 技术社区  · 16 年前

    我在输入文件的头上向下读取(),并在读取过程中读取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)
    

    有办法吗?

    3 回复  |  直到 16 年前
        1
  •  3
  •   M. S. B.    16 年前

    在处理完头之后,也许可以通过将其读入一个字符串并解析该字符串来执行“花哨”操作,为什么不直接从文件中读取数字并跳过字符“buffer”?

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

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

        2
  •  0
  •   eruciform    16 年前

    这就是你要找的吗?

    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都有一个标志,指定它不应该继续到下一行,而是将文件指针保持在适当的位置,以便下一次读取可以从那里开始。但我一下子记不起来了。。。

        3
  •  0
  •   Samizdis    16 年前

    哈哈,这似乎管用:

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