paprikaの日記: 3x5=5x3 1
日記 by
paprika
1. fwrite(ptr, 3, 5, fp);
2. fwrite(ptr, 5, 3, fp);
3. fwrite(ptr, 1, 15, fp);
4. fwrite(ptr, 15, 1, fp);
みなさん、どう書く?
1. fwrite(ptr, 3, 5, fp);
2. fwrite(ptr, 5, 3, fp);
3. fwrite(ptr, 1, 15, fp);
4. fwrite(ptr, 15, 1, fp);
みなさん、どう書く?
Stay hungry, Stay foolish. -- Steven Paul Jobs
エラー処理を考えに入れよう (スコア:1)
まず、element の本当の大きさは何バイトで、要素数はいくつなんだね?
仮に、element のサイズが 5byte で、要素数が3個だとしよう。
fwrite( ptr, 5, 3, fp )
この場合、fwrite は 0byte, 5byte, 10byte, 15byte の4つのパターンでファイルを書く事があり得て、それぞれに対して対策ルーチンを書く必要がある。例外は EOF(disk fullとか) だ。
.
これですぐ判ると思うが
fwrite( ptr, 15, 1, fp )
でも良い場合は存在する。つまり element 3つを一気に書いて欲しいの、無理なら全部諦めて、と言いたい場合。
しかし、
fwrite( ptr, 3, 5, fp )
fwrite( ptr, 1, 15, fp )
はNGだ。element の境界を無視したバイト数が返ってくる場合があり、その場合コーディングが一気に面倒くさくなる。
.
「HDD上にファイルを書くなら、どれでも 15byte一気でしょう?(disk fullに到達していない場合は)
そんな事考えるだけ無駄じゃん」
そう。HDD上にあるファイルを書くならそういう考えもありだ。でも実際には stdout のように他のプログラムへの出力の場合もある。名前がついていたって、named pipe の場合もある。bash で、
% afo >( ssh okky@world.machine 'cat > /etc/shadow' )
のような第1引数を fopen() でひらいて処理している場合、通信上の関係で「15byte一気にかける保証はない」。
fwrite() の第2,第3引数は、交換則は成り立っていないのだよ。
.
まぁ、実際には。そんな面倒なことになるのはよほど変態なライブラリの場合に限定されていて、ほとんどの場合は全部バッファリングされて一発の write(2) で済まされちゃうけどね。でも、その性質は実装依存。あなたのプログラムが依存して良い性質ではない。
fjの教祖様