【課題5−4 テキストファイルとバイナリファイル】
<テキストファイル>
文字列でデータを管理しているファイル.たとえば"10000"という数値を,fprintfをつかって%d書式指定でテキストファイルに書き出すと,'1', '0', '0', '0', '0'という文字に対応する文字コード(数値では0x31, 0x30, 0x30, 0x30, 0x30)が書き込まれる.テキストエディタでファイル内容が確認できる反面,ファイルサイズが大きくなってしまう.
<バイナリファイル>
数値データをそのまま管理しているファイル.fwrite関数を使って"10000"という数値を2バイトint型で書き出すと,0x2710という2バイトのデータが囲まれる.ファイルサイズが小さくてすむ反面,テキストエディタで内容が読めない.
fwrite関数:ブロック単位の書き込み
形式:
size_t fwrite(const void *buf, size_t
size, size_t n, FILE *fp);
機能: bufから,fpが指すファイルへ,sizeバイトのデータをn個書き込む.ファイル位置指示子を書き込んだデータバイト分進める.
返値: 正常時:書き込んだデータ個数(バイト数ではない)
異常時:nより小さな値.
fread関数:ブロック単位の読み込み
形式
size_t fread(void *buf, size_t size,
size_t n, FILE *fp);
機能: fpが指すファイルから,sizeバイトのデータをn個読み込み,bufに格納する.ファイル位置指示子を読み込んだデータバイト分進める.
返値: 正常時:読み込んだデータ個数(バイト数ではない)
異常時:nより小さな値
<ファイルのランダムアクセス>
ファイル入出力関数は,先頭から順に読み書きを行う(シーケンシャルアクセス)のに便利なように,自動的にファイル位置指示子を進める.ファイル中の任意の場所にアクセスする場合(ランダムアクセス)には,fseek関数を使ってファイル位置指示子を動かす.
fseek関数:ファイル位置指示子のセット
形式: int fseek(FILE *fp, long offset, int
origin);
機能: fpが指すファイルのファイル位置指示子を,originを基準としてoffsetバイト移動する.なお,fseek関数の呼び出し成功で,ファイル終了指示子をクリアする.
origin: SEEK_SET:ファイルの先頭
SEEK_CUR:ファイル内の現在地
SEEK_END:ファイルの終端
返値: 正常時:0
異常時:非0
ftell関数:ファイル位置指示子の値を調べる
形式: long ftell(FILE *fp);
機能: fpが指すファイルのファイル位置指示子の値を返す.
返値: 正常値:ファイル位置
異常時:-1L