1. 導入:なぜデータの「追記」が重要なのか
数値計算エンジニアにとって、シミュレーションのログや計算結果の履歴を保存することは日々の業務です。しかし、プログラムを再起動するたびに過去のデータが消えてしまったり、逆にファイルポインタの管理を誤ってデータを破壊してしまったりした経験はありませんか? FortranのOPEN文における POSITION=’APPEND’ を利用すれば、ファイル末尾への追記が確実に行えるようになり、大切なデータを保護しながら効率的に蓄積していくことが可能になります。
2. 基礎知識:ファイルポインタとオープンモード
ファイルに対する入出力を行う際、OSは「ファイルポインタ」という指標を使って、現在ファイルのどの位置を読み書きしているかを管理しています。通常、ファイルをオープンするとポインタは先頭(0バイト目)に配置されますが、これでは書き込みのたびに古いデータが上書きされてしまいます。POSITION=’APPEND’ を指定すると、プログラムはファイルをオープンした直後に、自動的にポインタをファイル末尾まで移動させます。これにより、既存のデータを一切変更することなく、新しいデータを追加し続けることができます。
3. 実装・解決策
実装は非常にシンプルです。OPEN文の引数に POSITION=’APPEND’ を追加するだけです。もし指定したファイルが存在しない場合は、通常の新規作成(STATUS=’NEW’ または ‘UNKNOWN’)として扱われ、ファイルが作成されます。これにより、ログファイルが初回生成時か追記時かを意識することなく、一つのロジックで安全に処理を完結できます。
4. サンプルプログラム
以下のコードをコピーして、コンパイル・実行してみてください。繰り返し実行することで、ファイルに時刻と計算結果が追記されていくことが確認できます。
program append_test
implicit none
integer :: iunit = 10
integer :: ios
character(len=20) :: timestamp
! 簡易的なタイムスタンプ取得(環境により調整してください)
call date_and_time(buffer=timestamp)
! POSITION='APPEND' を指定してファイルを開く
! ファイルが存在すれば末尾へ、なければ新規作成される
open(unit=iunit, file='simulation_log.txt', status='unknown', &
access='sequential', position='append', iostat=ios)
if (ios /= 0) then
print , "ファイルのオープンに失敗しました。"
stop
end if
! データの書き込み
write(iunit, ) "ログ記録時刻: ", timestamp
write(iunit, ) "計算処理を正常に完了しました。"
write(iunit, ) "----------------------------"
! ファイルを閉じる
close(iunit)
print , "データを追記しました。"
end program append_test
5. 応用・注意点
現場での開発において注意すべき点は、アクセスモードとの併用です。POSITION=’APPEND’ は、シーケンシャルアクセス(順次アクセス)を行っている時に有効です。もし直接アクセス(ACCESS=’DIRECT’)を使用している場合は、POSITION指定が無効になる、あるいはコンパイルエラーになる可能性があります。
また、頻繁に追記を行う場合は、書き込みのたびにCLOSE文を実行してバッファをフラッシュすることを推奨します。プログラムが予期せずクラッシュした場合でも、CLOSEを適切に行っておけば、それまでのデータがファイルに物理的に書き込まれているため、データの消失を最小限に抑えることができます。安全なデータ管理のため、ぜひ活用してください。

コメント