从数组而不是文件中读取

时间:2018-04-23 11:08:40

标签: fortran

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

read (unit=*, fmt=*) value

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

是否可以替换"参考"索引与另一个数据容器,如数组?

例如:

read (myarray, fmt=*) value

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

我必须将每read(unit=*, ...)更改为read(array(i), ...)并单独增加i以转到下一个元素。

由于程序很大,我正在寻找一种方法来保留现有的read语句,只是改变数据的来源。

所以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

2 个答案:

答案 0 :(得分:2)

是的,在您的示例中,您必须始终使用(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)

重要的是要记住,内部文件不会跟踪它的打开位置。该职位仅在每个writeread声明中有效。

答案 1 :(得分:0)

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

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

例如,如果你可以重写

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

作为

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

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