我是Fortran的新手,我需要编写一个代码,允许我读取包含不规则空格/不规则分隔的数据数组(1876列x 3126行)的文本文件(.dat)并将其写入具有一致格式的新文件。简而言之,我只希望数据列彼此对齐。
例如:
<4 spaces> 0.2341 15.0769 <2 spaces> -10.0672 1.6278 <3 spaces> 66.9851 -14.7123 <3 spaces> -0.4468 -2.5673
上面的例子基本上是数据列应该是什么样子,每个值之前有相应的空格数。值的格式为&#39; f10.4&#39;
这是我尝试编写的代码。我能够编译代码并运行exe文件,但是,它无法从文本文件中读取并产生运行时错误:文件结束。
program refgrid
implicit none
integer :: nrow, ncol
integer :: i, j
real, dimension(:,:), allocatable :: mat
print *, ' Input number of rows: '
read *, nrow
print *, 'Input number of columns: '
read *, ncol
allocate(mat(1:ncol,1:nrow))
open(UNIT=1, FILE='bathymetry2.dat', FORM='FORMATTED', STATUS='OLD', ACTION='READ')
do i=1, nrow
read(UNIT=1, FMT=*) mat
end do
close(UNIT=1)
open(UNIT=1, FILE='refgrid.dat', FORM='FORMATTED', STATUS='NEW', ACTION='WRITE')
do i=1, nrow
write(UNIT=1, FMT=101) mat
101 format(1826f10.4)
enddo
close(UNIT=1)
end program refgrid
我的问题:
如何使用do循环从一行连续读取值? 我在使用f格式的重复功能时感到有些困惑。 环。
我可以读/写数组&#34; mat&#34;作为一个整体阵列?或者我如何分配 data_list用于读/写?我可以分配整个矩阵而不是 个别元素?
我非常感谢对此事的任何帮助。谢谢!
答案 0 :(得分:1)
问题是,在do循环的每次迭代中,您尝试读入与整个数组mat
中一样多的元素。您应该在每次迭代中只填充一列。或者,您可以使用一个read语句读取整个数组,而不需要任何循环。
至于写作,您需要像列一样重复格式。 我建议动态创建一个格式字符串,以便它自动适应用户输入的列数。请参阅下面的示例。您也可以省略写入的do循环,因为Fortran将自动添加记录结束符号(换行符),当所有格式规范都被使用时,它将开始再次应用它们。
program refgrid
implicit none
integer :: nrow, ncol
real, allocatable :: mat(:,:)
character(20) :: form
print *, ' Input number of rows: '
read *, nrow
print *, 'Input number of columns: '
read *, ncol
allocate(mat(1:ncol, 1:nrow))
open(unit=1, file='bathymetry2.dat', status='OLD', action='READ')
read(1, *) mat
close(1)
write(form, "(A,I0,A)") "(", ncol, "F10.4)"
open(1, file='refgrid.dat', form='FORMATTED', status='NEW', action='WRITE')
write(1, form) mat
close(1)
end program refgrid
更新:至于格式说明符的动态创建:你写入字符串form
三件事:一个字符串(A
),一个只有它需要的字符数的整数({ {1}})和另一个字符串(I0
)。第一个字符串是A
,整数是(
,第二个字符串是ncol
。因此,如果F10.4)
的值为ncol
,则您将在128
中找到字符串form
。这是一个包含有效格式说明符的字符串,因此您可以在write语句中使用它而不是硬编码格式说明符。