計算機プログラミング ( 後半組 ) Computer Programming (2nd half group) 担当 : 城﨑知至 Instructor: Tomoyuki JOHZAKI 第 9 回ファイルの入出力 Lesson 9 input/output statements 教科書 7.3 章 1
ファイル入出力 : サンプル 1 下記プログラムを outin1.f90 として作成し コンパイル実 してみる Program outin1 implicit none character(len=10) :: ch10 character(1),dimension(10) :: ch1 integer :: i ch10 = "abcdefghij" write(1,'(a10)') ch10 rewind(1) read(1,'(10a1)') ch1 do i=1,10 write(*,'(a,i2,a,a1)') "ch1(",i,")= ",ch1(i) end do End program outin1 実 すると outin.f90 があるフォルダ内に 新たなファイルが作成される そのファイルの中 には何が書かれているか? 画 には何が出 されたか? を確認する
ファイル入出力 : サンプル 2 outin1.f90 をコピーして outin2.f90 に保存し 下記の修正を い コンパイル 実 してみる Program outin2 implicit none character(len=10) :: ch10 character(1),dimension(10) :: ch1 integer :: i ch10 = "abcdefghij" open(1,file= OUT.dat ) write(1,'(a10)') ch10 rewind(1) read(1,'(10a1)') ch1 close(1) do i=1,10 write(*,'(a,i2,a,a1)') "ch1(",i,")= ",ch1(i) end do End program outin2 実 結果の画 への表 は同じだが フォルダ内に OUT.dat というファイルが作成されているはず
なぜデータ入出力が必要か 計算条件等 毎回書き直してコンパイルするのは 倒 read(*,*) で読み込む場合でも 値が多いと打ち込むのが 倒 データとして 値 ( 計算条件 ) を残しておく 計算結果を保存したい 計算結果をグラフ化したい ファイルによる 出! 8
なぜデータ入出力が必要か プログラム ファイル ( 計算条件等 ) プログラミングコンパイル実 出 ファイル ( 計算条件 計算結果等 ) 解析可視化
データの入出力 1. 標準入出力 ( 復習 )
データの入出力 1 標準入出力 1 A. 出 ( テキスト p.3) print は基本的に画 への出 のみ write は画 出 とファイルへの出 ができる 標準出 ( 画 への出 ) 法 ( 第 2, 5 回講義の復習 ) 1. 書式指定なし print *, 出 項 並び 例 ) print *, A, B,C write(*,*) 出 項 並び 例 ) write(*,*) A, B,C 2. 書式付き print 書式, 出 項 並び 例 ) print '(1x,I3)', m write(*, 書式 ) 出 項 並び 例 ) write(*,'(1x,i3)') m write () 中の最初の * は出 先が標準 ( 画 ) 出 であることを す print の * やwrite () 中の2 番 の * は 書式 が標準の書式であることを指 している 書式 は 特定の書式 ( データを書き出す際の形式 ; 編集記述 や 字数表現 ) を指定する際に使 ( 第 5 回講義資料 & テキスト 5.2 章 p.46~)
データの入出力 1 標準入出力 2 B. ( テキスト p.3) read は標準 ( キーボード ) とファイルからの ができる () 付きと () 無しの 2 通りの記述 法がある 標準 ( キーボードからの ) ( 第 2, 5 回講義復習 ) 1. 書式なし read *, 項 並び 例 ) read *, A, B,C read(*,*) 項 並び 例 ) read(*,*) A, B,C 2. 書式付き read 書式, 項 並び 例 ) read '(1x,I3)', m read(*, 書式 ) 項 並び 例 ) read(*, '(1x,I3)') m read () 中の最初の * は 元が標準 ( キーボード ) であることを す () を使わない記述の場合は 原則として標準 である 括弧なしread の * や 括弧付きread () 中の2 番 の * は 書式 が標準の書式であることを指 している 書式 は 特定の書式を指定する際に使 ( 第 5 回講義資料 & テキスト 5.2 章 p.46~)
データの入出力 2. ファイルによる入出力
ファイルによるデータの入出力 1 数値計算やデータ解析における 出 計算条件等の設定 解析 データの読み込み 出 計算条件をメモとして出 する 計算結果をデータとして出 する
ファイルによるデータの入出力 2 A. ファイル指定 出 の使 ( テキスト 7.3 章 p.99~) read (unit 番号 書式 ) 項 並び write(unit 番号 書式 ) 出 項 並び 例 ) read(1,*) A, B, C 例 ) write(10,ʼ(3(1x,1e12.5))ʼ) A, B, C unit 番号 装置識別 read ではどこからデータを読むか?write ではどこにデータを出 するかを指定する番号 * 標準 出 ( キーボード 画 出 ) これまで使 してきた番号 open で割り当てられたファイル 装置への出 ( からの ) 5,6は特別な番号で 5 open で指定がなければ 標準 (read に使 ) 6 open で指定がなければ 標準出 (write に使 ) 字変数指定された 字変数に 出
ファイルによるデータの入出力 3 具体例 read(1,*) A, B, C write(10,ʼ(3(1x,1e12.5))ʼ) A, B, C 特にファイル名を指定しない場合は fort.unit 番号 というファイルが規定値となる read(1,*) unit 番号 1 のファイル fort.1 から データA, B, Cを読み込む Write(10, ) unit 番号 10 のファイル fort.10 に データA, B, Cをʼ1x,1e12.5ʼ の書式で出 する ファイル名を指定する場合は 次に す open と close を使 する
ファイルによるデータの入出力 4 open open( ファイル装置番号 file= ファイル名 [, 制御項 ]) read や write で指定した unit 番号とファイルを結び付ける 特定のファイルを いた 出 の場合 必ず read や write の前に open により結びつけを う必要がある ファイル装置番号 ; 負でない整定数 もしくは整数型変数 ( 式 )= unit 番号 ファイル名 : 出 のファイル名を 字定数 ( または 字変数 ) で与える 例 ) 実 ファイルと同じフォルダにある input.dat を開く場合,file = input.dat, 例 ) 字変数 character(len=10) :: fname = input.dat を いる場合,file =fname, 異なるフォルダにあるファイルを開く場合は フォルダの絶対座標 or 実 ファイルのあるフォルダからの相対座標を明記する つ上のフォルダならば../input.dat ( 相対座標 ) つ下にある dat フォルダにある場合は./dat/input.dat ( 相対座標 ) 制御項 ( 省略可 ) 本講義では使 せず 興味があればテキスト web 等を参照のこと close close( ファイル装置名 ) open で ったunit 番号と装置 ( ファイル ) の結びつけを切る 必要な 出 が終わった段階で close を れるようにする
ファイルによるデータの入出力 5 1. 予め データを準備しておく 実 プログラムと同じ場所 ( フォルダ ) に input.dat を作成 1 : コメント : データの説明 ( 整数配列, 法 2) 2 : 整数値 数値間はカンマで区切った 3 : コメント : データの説明 ( 単精度実数配列, 法 2) 4 : 実数値 数値間はスペースで区切った input.dat からの output.dat への出 2.input.dat を装置番号 1 として open してデータを読み込み その数値データを装置番号 2 の output.dat に出 する Program inout implicit none integer :: i(2) real :: r(2) open(1,file= input.dat ) read(1,*)!1 を読み ばす read(1,*) i(:)!2 データ読み込み read(1,*)!3 データを読み ばす read(1,*) r!4 データ読み込み close(1) open(2,file= output.dat ) write(2,*) i=,i write(2,*) r=,r close(2) End program inout!iの出!rの出
ファイルによるデータの入出力 6 Program inout implicit none integer :: i(2) real :: r(2) open(1,file= input.dat ) read(1,*)! Input.datの1 をスキップする read(1,*) i(:)! 2 からi = (i(1),i(2)) を読み込む read(1,*)! 3 をスキップする read(1,*) r! 4 からr = (r(1),r(2)) を読み込む close(1) End program inout read で 項 を書かない場合 (read(1,*) だけの場合 ) 何も読み込まず1 スキップする 標準 ファイル いずれも同じ データの区切りは カンマかスペース 標準 と同じ ファイルの1 にデータ数が多数ある場合は read で指定したデータまでを読み 後は読まない ファイルの1 のデータ数がread 指定数より少ない場合は ファイルの次の に移り 必要なデータ数になるまで読む
ファイルによるデータの入出力 7 Program inout implicit none integer :: i(2) real :: r(2) open(1,file= input.dat ) read(1,*)! read(1,*) i! read(1,*)! read(1,*) r! close(1) End program inout input.dat いずれの場合も 出 結果は同じ output.dat
演習 台形則で面積を求めるプログラム ( 演習 5 5, テキスト p.56) で 画面出力していた結果をファイル名 result.dat のファイルに出力する 出力内容は 各分割数ごとに分割数 積分値 相対誤差の絶対値 出力ファイル名を result.dat とし このファイルに結果を出力する 出力は 各分割数ごとに 1 行に分割数 積分値 相対誤差の絶対値を出力する
result.dat サンプル