ファイルopenのmodeの各挙動

back
※ 各名称は私が勝手に名付けてます:)
なお、モード("<",">",">>",...)とファイル名の間にはスペースがあっても構わない

■ open(FH, "<file")
モード: read only
ファイルが無い場合: エラー

ファイルハンドルから内容を読む。"<" を省略しても動作は同じ。


■ open(FH, ">file")
モード: write only
ファイルが無い場合: 空ファイルを作る

ファイルハンドルに書き込む。
open と同時にファイルサイズは 0 になる。
ロックファイルでなくデータファイルをこのモードで flock しても意味がないので注意


■ open(FH, ">>file")
モード: append
ファイルが無い場合: 空ファイルを作る

ファイルハンドルに追記する。
seek(FH, 0, 0) しても、先頭には移動できないが、
truncate(FH, 0) をすれば先頭から書き込むことはできる。(追記にならないけど)


■ open(FH, "+<file")
モード: read write
ファイルが無い場合: エラー

ファイルハンドルに読書き両方可能。
open 直後のファイルポインタは先頭にあるので、ポインタを移動せずに
いきなり書き込むと、ファイルの先頭部分から上書されるので注意。
逆に、ファイルハンドルを全て読んで、seek せずに書込みすると、追記状態になる。
また、読込->(値書き換え)->書込をする場合は、print のあとに、
truncate(FH,tell(FH))をしてファイルサイズを補正しないと、
書込み後のデータの方が少ない場合に、読込時のデータがゴミとして残るので注意。
ファイルハンドルを flock して読書する際の基本モード。


■ open(FH, "+>file")
モード: read write
ファイルが無い場合: 空ファイルを作る

ファイルハンドルに読書き両方可能。
ただし open と同時にファイルサイズは 0 になる。
よって、書込み->seek(FH,0)->読込するくらい(書き込んだ内容しか読めない)で、
使い道がわからない。


■ open(FH, "+>>file")
モード:  read write append
ファイルが無い場合: 空ファイルを作る

読書き両方追記型。
open 直後が読込みの場合は、先頭からファイルハンドルを読み、
書込の場合は、末尾に追記する。
seek(FH, 0, 0) しても、先頭には移動できないが、
truncate(FH, 0) をすれば先頭から書き込むことはできる。(追記にならないけど)

back