fread,fwrite


目次に戻る


fread,fwriteは変数の内容をファイルに保存したいときなどに使用します。
 
fread,fwriteの特徴は変数の生の情報を直接ファイルに書き込んでくれるので、ファイ ルサイズを小さくできたり、作成されたデータファイルをテキストエディタ等で見ただけで は内容がわからないので一種の暗号化も兼ねる事ができます。
 
欠点としては、書き込んだデータの順番やサイズをしっかり頭にたたき込んでおかな いといけないことと、異OS間での互換性が低くなる事です。これは主にビックエンディア ン、リトルエンディアンと呼ばれるメモリの使用方法の違いによって生じます。
 
このためUNIX系では機種間での互換を重んじる為ファイルに保存するデータは fread、fwriteを使わず、fprintf、fgets等を使ったテキスト形式で保存する事が多いです。 顕著な例がビットマップ(画像)ファイルの保存形式です。Windows標準の画像フォーマッ トbmpはメモ帳などで中身を見ても文字化けしてしまって、何の事やらわかりません。し かし、UNIXで広く使われているpixmapはテキストデータとして保存されているのでテキス トエディタで中を見ることができるのです。
 
最後に、昨日紹介した(内容は間違った)のと同じですがfread、fwriteの使用例です 。
int data[100];
FILE *fp;

fp = fopen( "fname" , "rb" );
    :
    :
fread( data , sizeof( data[0] ) , sizeof( data )/sizeof( data[0] ) , fp );
    :
    :
fclose( fp );

fp = fopen( "fname" , "wb" );
    :
    :
fwrite( data , sizeof( data[0] ) , sizeof( data )/sizeof( data[0] ) , fp );
    :
    :
fclose( fp );

fread,fwriteは戻り値として正常に読み(書き)込めたデータの個数を返すので、戻り値を 書き込む予定だった個数(3番目の引数。例だとsizeof(data)/sizeof(data[0]) )と比較し、戻り値の方が小さかったらファイルの終端(もしくはエラー)だとして別の処理 に移るということをします。
do {
    re = fread( data,  sizeof( data[0] ) , 1 , fp );
    /* なんか処理 */
} while( re == 1 );


目次に戻る