わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

ファイルから入力を得る第3の方法

先週金曜日の授業の補足です.
ファイルから入力を得る方法として,

  • 文字(1バイト)単位: fgetc, getchar
  • 文字列(1行または定数バイト)単位: fgets, fread

を紹介しましたが,これらに属しないもう一つの方法yet another wayについて,説明が抜けていました.
それは「fscanf」です.ファイル出力でのprintfは「fprintf」,それと同様に,ファイルから入力を獲得するscanfは,「fscanf」です.
ただし,fscanfにも,scanfと同じく,獲得に失敗すると,入力が進まないという問題がありますので,実用としてはお勧めできません.
fscanfを使うのであれば,代わりに,fgetsで1行を読み出し,それに対してsscanfを使用すれば,同じことが実現できるし*1,フォーマットに合っていない文字列があれば「読み飛ばす」ことも容易です.
とはいえ自分の経験として,fgets+sscanfもあまり使いません.「ファイルから何らかの情報を得たい」ときにお勧めするコードの書き方は,以下の通りです.

  • ファイルポインタを入力にとって情報を返すような関数を定義します.
  • その関数の中で,1バイト単位で読み出すか文字列単位で読み出すライブラリ関数を使用します.
    • その関数は,while文による反復の中で呼び出します.
    • 関数の戻り値には毎回注意します.ファイルの終わりになるなどして読み出せなくなったら,それまで読み出した値でなんとか情報を作るか,それができなければ,失敗を表す情報を,関数の戻り値とします.

*1:fgetsは,1回で読み出せるバイト数に上限があるので,1行がそのサイズを超える(ような入力がある)ときは,要注意です.