3

この問題の解決策を求めてインターネットを何時間もかけて探しましたが、何も見つかりません。フォーマットされていない出力を、さまざまな長さと複数のデータ型の複数の非常に長い行を持つ CSV 出力ファイルに書き込もうとしています。最初に、下に書き込まれる変数を示す長いヘッダーをコンマで区切って書き込もうとしています。その下の行に、ヘッダーで指定された値を書いています。ただし、順次アクセスでは、長い出力行が複数の短い行に分割されます。これは、私が望んでいたことではありません。open ステートメントで recl を使用して行の長さを制御しようとしましたが、出力の後に文字化けしたテキストと記号が大量に追加されただけで、同じ問題が引き続き発生しました。私も直接アクセスを使用しようとしましたが、行の長さが同じではないため、どちらも機能しません。Fortran2003 でストリーム I/O を使用することについて読んだことがありますが、Fortran90 を使用しているため、それも機能しません。FTN95 コンパイラを使用する Plato IDE で Fortran 90 を使用しています。配列といくつかのダミーテキストを使用して、以下でやりたいことに似たサンプルプログラムを含めました。また、問題を示す出力を以下に含めました。writeステートメントごとに1行だけできる方法を知っている人はいますか? どんな助けでも大歓迎です。writeステートメントごとに1行だけできる方法を知っている人はいますか? どんな助けでも大歓迎です。writeステートメントごとに1行だけできる方法を知っている人はいますか? どんな助けでも大歓迎です。

module types
  integer, parameter :: dp=selected_real_kind(15)
end module types

program blah
  use types
  use inputoutput

  implicit none

  integer :: i
  character(50)::fileNm
  integer :: unitout2=20
  real(dp), dimension(100) :: bigArray

  fileNm='predictout2.csv'
  open(unit=unitout2,file=fileNm,status="replace")

  do i=1,100
    bigArray(i)=i
  end do

  write(unitout2,*)"word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,&
  &word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,&
  &word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word"
  write(unitout2,*)bigArray

  close(unitout2)

end program

上記のプログラムの出力は次のとおりです (recl なし)。

 word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word
  ,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,word,wo
  rd,word,word,word,word,word
           1.00000000000              2.00000000000              3.00000000000              4.00000000000
           5.00000000000              6.00000000000              7.00000000000              8.00000000000
           9.00000000000              10.0000000000              11.0000000000              12.0000000000
           13.0000000000              14.0000000000              15.0000000000              16.0000000000
           17.0000000000              18.0000000000              19.0000000000              20.0000000000
           21.0000000000              22.0000000000              23.0000000000              24.0000000000
           25.0000000000              26.0000000000              27.0000000000              28.0000000000
           29.0000000000              30.0000000000              31.0000000000              32.0000000000
           33.0000000000              34.0000000000              35.0000000000              36.0000000000
           37.0000000000              38.0000000000              39.0000000000              40.0000000000
           41.0000000000              42.0000000000              43.0000000000              44.0000000000
           45.0000000000              46.0000000000              47.0000000000              48.0000000000
           49.0000000000              50.0000000000              51.0000000000              52.0000000000
           53.0000000000              54.0000000000              55.0000000000              56.0000000000
           57.0000000000              58.0000000000              59.0000000000              60.0000000000
           61.0000000000              62.0000000000              63.0000000000              64.0000000000
           65.0000000000              66.0000000000              67.0000000000              68.0000000000
           69.0000000000              70.0000000000              71.0000000000              72.0000000000
           73.0000000000              74.0000000000              75.0000000000              76.0000000000
           77.0000000000              78.0000000000              79.0000000000              80.0000000000
           81.0000000000              82.0000000000              83.0000000000              84.0000000000
           85.0000000000              86.0000000000              87.0000000000              88.0000000000
           89.0000000000              90.0000000000              91.0000000000              92.0000000000
           93.0000000000              94.0000000000              95.0000000000              96.0000000000
           97.0000000000              98.0000000000              99.0000000000              100.000000000
4

1 に答える 1

6

これは、ファイル (ストリーム、シーケンシャル、または直接) に使用される ACCESS の問題ではありません。使用しているフォーマット仕様の結果です。

フォーマットされていない出力を行っていないことに注意してください。フォーマットされているかフォーマットされていないかは、出力が人間が読めるように意図されているかどうかの問題です。

WRITE ステートメントの 2 番目の指定子のアスタリスクは、リスト指示書式の指定です。これは、出力に使用される形式が、出力されるもののリストに基づいていることを意味します。それを超えて、言語内のリスト指示出力に関する小さな規則のセットを超えると、見た目はほとんど Fortran プロセッサ (コンパイラ) に任せることになります。

リスト指向の書式設定された出力では、プロセッサはアイテム間に収まると判断した数のレコードを挿入することが明確に許可されています。ここでは、人々がファイルを読みやすくするために、かなり合理的にそれを行います。

出力の外観をさらに制御したい場合は、明示的な形式を使用してください。たとえば、次のようなものです。

write(unitout2,"(9999(G12.5,:,','))") bigArray

の方が適切かもしれません。

(技術的には、シーケンシャル ファイルが開かれるとき、超えてはならないプロセッサ定義の最大レコード長があります (プログラマーが指定した最大長がない場合)。実際には、シーケンシャル形式のファイルが現在のほぼすべての Fortran によってディスクに格納される方法を考えると、コンパイラ、その専門性は問題を引き起こしません。)

于 2013-11-07T01:58:02.433 に答える