7

WRITE (*,*) inputFortran 90 でファイルにデータを書き込む必要があります。値をにグループ化するにはどうすればよいですか? 常に各呼び出しWRITEの後に置く、それが問題です。new line

コード例:

open (unit = 4, file = 'generated_trajectories1.dat', form='formatted')

do time_nr=0, N
   write (4,*) dble(time_nr)*dt, initial_traj(time_nr)
end do

そして今、ポイントはそれを別々の列に書くことです.

4

4 に答える 4

13

暗黙の DO ループを使用して、値を単一のレコードとして書き込むことができます。次の 2 つの例を比較してください。

integer :: i

do i=1,10
   write(*,'(2I4)') i, 2*i
end do

以下を生成します。

1   2
2   4
3   6
...

暗黙の DO ループを使用すると、次のように書き換えることができます。

integer :: i

write(*, '(10(2I4))') (i, 2*i, i=1,10)

これは以下を生成します:

1   2   2   4   3   6   ...

要素の数がコンパイル時に固定されていない場合は、次の<n>拡張機能を使用できます ( ではサポートされていませんgfortran)。

write(*, '(<n>(2I4))') (i, 2*i, i=1,n)

(2I4)変数の値から、編集記述子の繰り返し回数を取得しますn。GNU Fortran では、最初に内部ファイルを使用して適切な編集記述子を作成できます。

character(len=20) :: myfmt

write(myfmt, '("(",I0,"(2I4))")') n
write(*, fmt=myfmt) (i, 2*i, i=1,n)

もちろん、リスト指示出力 (の形式での出力*)でも機能します。

write(*, *) (i, 2*i, i=1,10)
于 2012-08-17T11:04:18.540 に答える
4

これは、実際にファイルに書き込もうとしているデータ(つまり、ループ内にスカラーがあるか配列内にあるかなど)によって異なります。あなたの質問にこれの説明を含めることができますか?

同じ行にスカラーを複数回書き込もうとしている場合は、非進行I / Oを使用して、キーワード引数advance="no"をwriteステートメントに渡してみてください。

integer :: x

do x = 1,10
  write(*, fmt='(i4,1x)', advance="no") x
end do

ただし、 I/Oが進行しないサプライズに注意してください。

于 2012-08-17T09:09:18.500 に答える
0

古き良き $ 編集記述子はどうですか:

write(*, fmt='(i4,$)') x

ループの後に write(*,*) を実行することを忘れないでください...

于 2012-08-18T13:56:18.110 に答える
0

答えは、Chris の質問に対するあなたの答えによって異なります。単一の行が必要な場合は、Chris が説明したように、非進行 IO を使用する必要があります。これがないと、複数のフォーマットされた書き込みステートメントを使用すると、常に複数の行が得られます。

また、リスト指向 (*) IO の代わりに、フォーマットされた IO を使用する必要がある可能性があります。リスト指向の IO のルールは緩いです。コンパイラが異なれば、異なる出力が生成される場合があります。出力項目が多い場合、改行によって出力行が長くなりすぎないようにすることができます。

すべての変数が実数である場合に機能するはずの形式を次に示します。

write (4, '( *(2X, ES14.6) )', advance="no" )
于 2012-08-17T15:18:44.743 に答える