【问题标题】:Read a line containing (large) N reals to an array in Fortran将包含(大)N 个实数的行读取到 Fortran 中的数组
【发布时间】:2011-03-14 14:29:08
【问题描述】:

我已经从一个输入文件的头部向下读取(),并在途中读取了 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 最终会变得很大,所以我真正需要的是一种逐个解析元素的方法。

请说有办法吗?

【问题讨论】:

  • 我必须承认,我很难理解您的问题。您是在问“如何将 L 个实数从一行读入一个可分配的数组?” ? (如果 L 未知,将它们读入字符变量,然后使用内部读取,对它们进行计数并将它们读入数组)。

标签: arrays fortran io


【解决方案1】:

在你处理完标题之后,也许通过将它读入字符串并解析字符串来做一些“花哨”的事情,为什么不直接从文件中读取数字并跳过字符“缓冲区”?

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

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

【讨论】:

    【解决方案2】:

    哈哈,这似乎行得通:

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

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

    【讨论】:

    • 这是一种非常危险的做法。
    • 因为你不知道自己在做什么。使用这种方法,你很可能会陷入一种你认为自己正在做某事的情况,而程序实际上会做一些完全不同的事情。这可能很危险。
    • 我相信这会一直读到 A 满为止。如果 A 的大小错误,您将遇到文件结尾错误或丢失值,否则,我认为没关系。 (晚了 4 年,但是嘿)
    【解决方案3】:

    这是你要找的吗?

    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 可以从那里开始。但是一时想不起来了……

    【讨论】:

    • 不是真的,我所有的值都在同一行,所以逐行解析没有意义。不过,它肯定比我拥有的要好,谢谢。
    • 更新了更多信息,但仍然不是完整的答案。您是否尝试过读取数组并使用表示实数数组的格式?
    • 要继续从同一行读取,您可以在读取语句上使用“advance='no'”。我不认为我会用这个来解决这个问题。
    • 谢谢,我已经 10 多年没有解决这个问题了,我的 fortran mojo 已经枯萎了。非常感谢! :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2020-02-05
    • 2016-12-15
    • 2019-09-26
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多