1

私は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

上記の例は、基本的に、データの列がどのように見えるかを示しており、各値の前に対応する数のスペースがあります。値の形式は「f10.4」です。

これが私が書いてみたコードです。コードをコンパイルして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ループを使用して行から値を連続して読み取るにはどうすればよいですか?'do'ループでf形式の繰り返し機能を使用することに少し混乱しています。

  2. 配列「mat」を配列全体として読み取り/書き込みできますか?または読み取り/書き込み用にdata_listを割り当てるにはどうすればよいですか?個々の要素ではなく、マトリックス全体を割り当てることはできますか?

この件に関して何か助けていただければ幸いです。ありがとうございました!

4

1 に答える 1

1

問題は、 do ループのすべての反復で、配列全体にある要素と同じ数の要素を読み込もうとすることですmat。各反復で 1 つの列のみを入力する必要があります。または、ループなしで 1 つの read ステートメントで配列全体を読み取ることができます。

書き込みに関しては、列の数だけフォーマットを繰り返す必要があります。ユーザーが入力した列の数に自動的に適応するように、フォーマット文字列を動的に作成することをお勧めします。以下の例を参照してください。Fortran は、すべての形式指定が消費されると自動的に記録終了記号 (改行) を追加し、それらを再度適用し始めるため、書き込みの do ループも省略できます。

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)、必要な文字数だけの整数 ( I0)、およびその他の文字列 ( A) の 3 つを文字列に書き込みます。最初の文字列は(、整数はncol、2 番目の文字列はF10.4)です。したがって、ncol128があればform、文字列に含まれます(128F10.4)。これは有効な書式指定子を含む文字列であるため、ハードコードされた書式指定子の代わりに書き込みステートメントで使用できます。

于 2013-03-21T17:13:44.343 に答える