从文本文件中读取矩阵并打印

Read a matrix from a text file and print it

我想从一个 12 行的 txt 数值文件写一个 3 x 4 矩阵 我已经为此编写了一个 Fortran 90 程序

program array
  implicit none

  integer, parameter :: I4B = selected_int_kind(4)
  integer (I4B), allocatable, dimension (:,:) :: arr
  integer (I4B) :: i

  open(unit=99, file='1.txt')
  open(unit=100, file='out.txt')

  Allocate (arr(3,4))

  do i=1, 12
    read(99,*)arr(3,4)
    write(100,*),arr(3,4)
  enddo

  close (99)

  deAllocate (arr)

  stop
endprogram array

但是报错

At line 10 of file array.f90 (unit = 99, file = '1.txt')
Fortran runtime error: End of file

第 10 行是 read(99,*)arr(3,4)

这是数组的一个非常简单的实现。它使用第一个索引变化最快的事实。所以我只是继续阅读,直到数组的所有 12 个元素都被填满。

然后,对于输出,我指定了一种格式,它应该每行写入 3 个值。

program readfile
    implicit none
    integer, dimension(:, :), allocatable :: arr
    open(unit=99, file='1.txt', action='READ', status='OLD')
    open(unit=100, file='out.txt', action='WRITE', status='NEW')
    allocate(arr(3, 4))
    read(99, *) arr
    write(100, '(3I4)') arr
    close(99)
    close(100)
end program readfile

如果你想明确地这样做,你必须为每个读取的值独立计算两个索引:

program readfile
    implicit none
    integer, dimension(:, :), allocatable :: arr
    integer :: i, row, col
    open(unit=99, file='1.txt', action='READ', status='OLD')
    open(unit=100, file='out.txt', action='WRITE', status='NEW')
    allocate(arr(3, 4))

    ! Read the elements:
    do i = 1, 12
        row = mod(i-1, 3)+1
        col = (i-1) / 3 + 1
        read(99, *) arr(row, col)
    end do

    ! write the elements:
    do i = 1, 4
        write(100, '(3I4)') arr(:, i)
    end do
    close(99)
    close(100)
end program readfile

顺便说一句,你的代码:

do i = 1, 12
    read(99, *) arr(3, 4)
    write(100, *) arr(3, 4)
end do

只需 12 次从输入文件中读取一个数字,将其存储在数组的最后一个位置,然后将相同的数字写回输出文件。

此外,您的错误消息表明您已尝试阅读超过文件末尾的内容。您的 1.txt 不包含 12 行,或者您可能先阅读了其他内容,例如找出有多少个元素。在这种情况下,您需要在开始读取实际数字之前添加 rewind(99)