从文本文件中读取矩阵并打印
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)
。
我想从一个 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)
。