【问题标题】:READ from array instead of file从数组而不是文件读取
【发布时间】:2018-10-03 09:57:03
【问题描述】:

我有一个现有的 Fortran 77 程序,其中输入值是从输入文件中读取的。

read (unit=*, fmt=*) value

read 语句每次调用都会自动跳转到文件的下一行。

是否可以用另一个数据容器(如数组)替换“引用”索引?

例如:

read (myarray, fmt=*) value

我试过了,但它总是读取第一个数组元素并且不会自动跳转到下一个元素。

我必须将每个 read(unit=*, ...) 更改为 read(array(i), ...) 并分别增加 i 才能到达下一个元素。

由于程序很大,我正在寻找一种方法来保留现有的读取语句并只需更改数据源。

所以unit 不会是一个整数值,而是一个数组,其中每个元素都是我输入文件中的一行。

有人有想法吗?

我试图用代码描述问题: (input_file.input 只有 15 行,数字为 1 到 15)

program FortranInput

implicit none

! Variables

integer :: i, inpid
character*130, dimension(100) :: inp_values
character*130 :: value

inpid = 20

! Open File
open(inpid, file='input_file.input')

! Read from file ------------------------------------------------
do i = 1, 15
    ! read always takes the next line in the file
    read(inpid,'(a130)') value

    ! write each line to new array-element
    inp_values(i) = value

    ! output each line from file to screen
    write(*,*) value
end do

close (inpid)



! Read from array -----------------------------------------------

do i = 1, 15

    ! read always takes the first line in the array
    read(inp_values,'(a130)') value

    write(*,*) value

end do 

end program FortranInput

【问题讨论】:

  • 欢迎,请接受欢迎tour 并阅读How to Ask。学习一下问题编辑器的格式化功能,让你的问题更具可读性会很好。
  • 很抱歉,您向我们展示的代码还远远不够。您必须告诉我们这些数组是如何声明的以及它们是什么数据类型。它们是character 字符串吗?还向我们展示您实际使用read 语句的代码。你能在一个语句而不是循环中做更多的阅读吗?也许是一个隐含的行为?我们必须看到更多代码。
  • 嗨弗拉基米尔,你是对的,我发现很难解释我的问题..对不起!我编辑了帖子并添加了一些代码。基本上我的问题是,如果我从文件中读取,READ-Statement 总是跳到下一行,如果我从数组中读取,它不会。
  • 我想将我所有的 READ 语句保留在当前直接从输入文件(整数 :: inpid)读取的代码中,并将 inpid 的数据类型更改为数组(字符,维度::inpid)
  • 如果目标是尽可能保持代码相同,您可以将数组写入文件并读回..

标签: fortran


【解决方案1】:

是的,在您的示例中,您必须始终使用 (i) 语法从适当的数组元素中读取。我看不到其他方式。

但是,通常您可以在不使用元素索引的情况下将字符数组用作多条记录中的文件。考虑一下:

integer :: i, n=15
character*130, dimension(100) :: inp_values
character*130 :: value
integer :: values(100)

do i = 1, n
    write(value,*) i

    inp_values(i) = value
end do

read(inp_values,'(*(i130,/))') values(1:n)

write(*,*) values(1:n)

甚至

read(inp_values,*) values(1:n)

请务必记住,内部文件不会跟踪打开它的位置。该位置仅在每个write 或read 语句中有效。

【讨论】:

  • 很高兴了解字符数组。但就我而言,恐怕我必须更改代码。非常感谢!
【解决方案2】:

与外部文件不同,内部文件没有持久位置的概念(在输入/输出语句之间)。在这方面,如果您希望一条读取语句从一条记录传输,而下一条读取语句从另一条记录传输,则必须直接引用这些记录。

但是,您并没有展示您真正想要如何使用输入。如果您可以重写输入以使用单个读取语句,则相应的记录将成为源。

例如,如果你可以重写

do i=1,5
   read(unit, '(I5)') x(i)
end do

作为

read(unit, '(I5,/)') x(1:5)

然后您可以轻松切换到使用内部文件。

【讨论】:

  • 非常感谢,我对内部和外部文件一无所知。就我而言,我将不得不更改代码中的读取语句并直接引用它们。我的输入非常有限。
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多