2

入力ファイルは次のようになります。

...
Binning n:    4, "Si2-Events",  Event #:            12, Primary(s) weight  1.0000E+00
    Number of hit cells:           3
      488534  4.23038400E-05      489533  1.50734719E-04      489534  5.79968946E-05

   Binning n:    4, "Si2-Events",  Event #:            13, Primary(s) weight  1.0000E+00
    Number of hit cells:           2
      477500  3.04398331E-04      478500  1.13192732E-06

   Binning n:    4, "Si2-Events",  Event #:            14, Primary(s) weight  1.0000E+00
    Number of hit cells:           2
      512496  1.32522946E-05      513496  2.86743394E-04

   Binning n:    4, "Si2-Events",  Event #:            15, Primary(s) weight  1.0000E+00
    Number of hit cells:           2
      476539  1.95245666E-04      476540  2.37216373E-05

   Binning n:    4, "Si2-Events",  Event #:            16, Primary(s) weight  1.0000E+00
    Number of hit cells:           9
      502533  1.26090490E-05      502534  1.00212252E-04      503527  3.07000097E-04      503528  9.53662311E-06      503529  9.42530642E-06      503530  1.07992764E-05      503531  1.26466557E-05      503532  1.68176994E-05      503533  1.18242851E-05
...

言い換えれば、私は多くの行を持つファイルを持っており、それぞれが3行目にセル番号とエネルギーを表示しています.

488534  4.23038400E-05      489533  1.50734719E-04      489534  5.79968946E-05

この行だけを読み取り、出力ファイルにセル番号とエネルギーを 2 つの列に書き込む Fortran コードを書きたいと思います。

Line             1                    

Cells   488534
        489533
        489534

Energy
 4.23038400E-05
 1.50734719E-04
 5.79968946E-05


Line 2 

Cells     477500  
          478500  

Energy  3.04398331E-04
         1.13192732E-06


etc...

問題は、セルの数が行ごとに異なることです。すべての値を読み取ったときに次の行にスキップするにはどうすればよいですか?

以下は、私がテストしたコードの一部です。

open (unit=7, file="Si1.txt", action="read", access="sequential")


open (unit=8, file="output.txt", action="write")

do i = 1, 900


    read (7,*) line1
    read (7,*) line2
    read (7,*) cell1, energy1, cell2, energy2
    write(8,*) "Run = ", i, "and cells = ", cell1, cell2, "and energy = ", energy1, energy2
end do

問題は、その行に 2 つ以上の値がある場合にのみ機能し、2 つ未満の場合は機能しないことです。

私は少し迷っています (そしておそらくここでは初心者です) が、これを機能させる方法について何か提案はありますか?

4

1 に答える 1

3

現在、各ブロックの 2 行目の有用な情報、つまり、ブロックの 3 行目にあるセル数/エネルギーのペアの数を無視しています。それでその情報を入手してください。

あなたの

read(7,*) line2

のような発言によって

 read(7,'(a32,i)') words, num_cells

「など」と書いているのは、words変数に読み込む文字数を数えていないためです (これは ascharacter(len=32) :: wordsまたは同様に宣言します)。それは自分で行う必要があります。このステートメントの実行後、整数変数num_cellsには、次の行から読み取るセルのペアの数が含まれます。あなたの

read (7,*) cell1, energy1, cell2, energy2

do ix = 1, num_cells
   read (7,fmt=*, advance='no') cell(ix), energy(ix)
end do
read (7, '()', advance = ’yes’)

引数はadvance=no、セル/エネルギーのペアを読み取った後、入力ファイルの次の行に移動しないようにプロセッサに指示します。一方、ループの最後の行は、プロセッサに次の行に移動するように指示します。

明らかに (?) 私はあなたに完全な解決策を書いたわけではありませんが、残りの方法で解決できるはずです。また、これをテストしていないため、構文に小さなエラーがある可能性があります。

于 2013-10-01T13:09:46.840 に答える