Fortranは、ファイルアクセスの三つの形式をサポート - DIRECT、STREAM(F2003 +)とSEQUENTIALを。 DIRECTアクセスとSTREAMアクセスの両方のサポートがファイルの以前の部分を書き換えることができ、SEQUENTIALアクセスは行われません(以前のレコードへの書き換えは、書き換えられたレコードでファイルを切り捨てます)。
直接アクセスでは、ファイル内のすべてのレコードの長さが同じです。ステートメントに関連レコード番号を指定するだけで、任意の入出力レコードで任意のレコードにアクセスすることができます。ただし、ダイレクトアクセスファイルの一般的なディスクフォーマットでは、ファイルの考え方が「行」と一致しないことがあります。
フォーマットされたストリームアクセスでは、ファイル内の現在の位置をINQUIREステートメントを使用して取得し、その後の入出力ステートメントはPOS指定子を使用してその位置でデータ転送を開始できます。フォーマットされたストリームアクセスファイルの典型的なディスクフォーマットは、通常、人々がラインを持つテキストファイルに期待するものと一致します。
ストリームアクセスが必要な場合があります。両方のアプローチの例を以下に示します。
直接アクセス:
PROGRAM direct
IMPLICIT NONE
INTEGER :: unit
REAL :: r
INTEGER :: line
OPEN(NEWUNIT=unit, &
FILE='direct.txt', &
STATUS='REPLACE', &
ACCESS='DIRECT', &
RECL=15, & ! The fixed record length.
FORM='FORMATTED')
CALL RANDOM_SEED()
! No need to write records in order - we just leave off
! writing the first record until the end.
line = 0
DO
CALL RANDOM_NUMBER(r)
IF (r < 0.05) EXIT
line = line + 1
PRINT "('Writing line ',I0)", line
! All the "data" records are offset by one, to allow the
! first record to record the line count.
WRITE (unit, "('line ',I10)", REC=line+1) line
END DO
! Now update the first record with the number of following "lines".
WRITE (unit, "(I10)", REC=1) line
CLOSE(unit)
END PROGRAM direct
ストリーム・アクセス:
PROGRAM stream
IMPLICIT NONE
INTEGER :: unit
REAL :: r
INTEGER :: line
INTEGER :: pos
OPEN(NEWUNIT=unit, &
FILE='stream.txt', &
STATUS='REPLACE', &
ACCESS='STREAM', &
POSITION='REWIND', &
FORM='FORMATTED')
CALL RANDOM_SEED()
! Remember where we are. In this case, the position
! is the first file storage unit in the file, but
! it doesn't have to be.
INQUIRE(unit, POS=pos)
! Leave some space in the file for later overwriting
! with the number of lines. We'll stick the number
! zero in there for now.
WRITE (unit, "(I10)") 0
! Write out the varying number of lines.
line = 0
DO
CALL RANDOM_NUMBER(r)
IF (r < 0.05) EXIT
line = line + 1
PRINT "('Writing line ',I0)", line
WRITE (unit, "('line ',I10)") line
END DO
! Now update the space at the start with the number of following "lines".
WRITE (unit, "(I10)", POS=pos) line
CLOSE(unit)
END PROGRAM stream
はあなたの詳細な回答やプログラムをありがとうございました。これは私のバックアップ計画でした。あなたはファイルを書き換えるためのコードを書いて私の時間を節約しました。 :) –
これは私がそれをやる方法です。私は私が知らないより良いものがないという保証はしません。 – chw21