Fortran:读取字符串中带有不规则分隔项的文本文件

时间:2013-03-21 14:49:48

标签: arrays string datagrid text-files fortran95

我是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

我的问题:

  1. 如何使用do循环从一行连续读取值? 我在使用f格式的重复功能时感到有些困惑。 环。

  2. 我可以读/写数组&#34; mat&#34;作为一个整体阵列?或者我如何分配 data_list用于读/写?我可以分配整个矩阵而不是 个别元素?

  3. 我非常感谢对此事的任何帮助。谢谢!

1 个答案:

答案 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语句中使用它而不是硬编码格式说明符。