こんばんは。
ある程度大きなデータをファイルへ書きだそうと思ったのですが。
下記コードの方法1で書き込むと書き込まれないデータがちょくちょく出てきました。
(奇数サイズになると1バイト書き込まれないのが原因だと思います)
そこで方法2のように書き込みサイズが奇数か偶数かで分けて書き込んでみると
全くデタラメでおかしいデータが書き込まれてしまいました。
本来であればfwrite(buf,size,1,fp);とすればいいのですが、
そうすると書き込みブロックが大きいせいなのか、1回のfwriteなのに
やたらと処理に時間がかかります。
どうすればいいでしょうか。
fwriteで漏れ無くデータを書き込む方法
fwriteで漏れ無くデータを書き込む方法
最後に編集したユーザー shiro4ao on 2012年9月23日(日) 22:34 [ 編集 2 回目 ]
Re: fwriteで漏れ無くデータを書き込む方法
おそらく、おっしゃるとおりの理由だと思います。shiro4ao さんが書きました: 下記コードの方法1で書き込むと書き込まれないデータがちょくちょく出てきました。
(奇数サイズになると1バイト書き込まれないのが原因だと思います)
奇数・偶数で場合分けした際の書き込む基点がbuf[size]である理由は何でしょうか。
buf[]の定義範囲外を指しているように思えてなりません。
で、そういう工夫をしたところで、書き込む大きさが結局sizeバイトであることには変わらないので、
工夫の結果がいい方向に出るかどうかはちょっと怪しいような気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: fwriteで漏れ無くデータを書き込む方法
最初のfwriteでsizeバイト書き込んであるので、sizeバイトぶん進んだ位置から書き始めないと
データが重複すると思ったからです。
具体的には
buf="abcdefghi"ならsize=9なので、最初に書き込むのはsize/2の4バイト(abcd)
残りがefghiなので先頭のaから数えてsize/2バイト目から書き込むべきだと思ったからです。
追記
すみません。間違えていました。
おっしゃるとおり、bufの範囲外を指定していました。正しくは
&buf[size/2]を指定するべきでした。
最初の投稿の部分も修正しておきます。
データが重複すると思ったからです。
具体的には
buf="abcdefghi"ならsize=9なので、最初に書き込むのはsize/2の4バイト(abcd)
残りがefghiなので先頭のaから数えてsize/2バイト目から書き込むべきだと思ったからです。
追記
すみません。間違えていました。
おっしゃるとおり、bufの範囲外を指定していました。正しくは
&buf[size/2]を指定するべきでした。
最初の投稿の部分も修正しておきます。
Re: fwriteで漏れ無くデータを書き込む方法
何度も投稿すみません。
先ほどの、方法2でうまくデータが書き込まれたことを確認しました。
なぜ1まとまりで書き込むと時間が異常にかかるのかはわかりませんが、
なんとか漏れ無く書き込めたのでこれにて解決とさせて頂きます。
ありがとうございました。
先ほどの、方法2でうまくデータが書き込まれたことを確認しました。
なぜ1まとまりで書き込むと時間が異常にかかるのかはわかりませんが、
なんとか漏れ無く書き込めたのでこれにて解決とさせて頂きます。
ありがとうございました。
Re: fwriteで漏れ無くデータを書き込む方法
方法3のが一番スマートですね。
戻り値が書き込んだ数を教えてくれるんでした
戻り値が書き込んだ数を教えてくれるんでした