- ベストアンサー
C言語のfwrite関数について
現在,バイナリのデータを処理するプログラムを作成しています。 おおまかに言えば,ファイルA(バイナリモードでオープン)からバイナリでデータを読み込んできて,そのデータを処理してファイルB(バイナリモードでオープン)に書出す,のようなプログラムです。 その処理したデータを入れるデータ型にunsigned long long int型(64bit)を使用しています。 その処理データをファイルBに書出す時に,fwrite関数を用いています(例参照)。 (例) for(i=0; i<N; i++){ fwrite(&c[i], sizeof(c[i]), 1, fp); } //配列cが「unsigned long long int型」です。 //配列cは最初に"0"で初期化しています。 //fpはファイルポインタです。 しかし,本システムでunsigned long long int型が実際に使用しているのは下位32bitです。 上の例で書出した場合,上位32bitの"0"も書出されていることになるのでしょうか。 書出されたファイルのサイズを見れば,64bit全て書出されているようですが,計算間違いで32bitを超えたところまで何かデータが入っている可能性もあります。 どなたはfwrite関数に詳しい方,ご回答をよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
sizeof(c[i])が8ですから、8バイト(64bit)かかれます。 4バイト(32bit)だけ書きたいなら、 fwrite(&c[i],4,1,fp);
その他の回答 (4)
- MovingWalk
- ベストアンサー率43% (2233/5098)
#4です。 ファイルにどのように書かれているかは、バイナリエディタで調べればわかります。 こちらに各種ありますから、お好みのものを使って調べてください。 http://www.vector.co.jp/vpack/filearea/win95/util/bin/edit/by_trend.html
- MovingWalk
- ベストアンサー率43% (2233/5098)
>実際に使用しているのは下位32bitです それなら、long型を使えばよさそうですが?? >上位32bitの"0"も書出されていることになるのでしょうか。 そうです。64ビットの数値領域をそのまま書き出しています。 >計算間違いで32bitを超えたところまで何かデータが入っている可能性もあります。 ご質問の趣旨は、こういう場合には上位32ビットをクリアしたいということで しょうか? それなら c[i] &= 0xffffffff; を行なってから書き出せば いいかと思います。 いずれにしても、あまりfwrite()には関係がないと思いますが...
- gimmick
- ベストアンサー率49% (134/270)
#2さんの回答ですが、 fwrite((char*)&c[i]+4,4,1,fp); のようにキャストする必要があるかと思います。 また、longが32bitの場合、 for(i=0; i<N; i++){ unsigned long tmp; tmp = (unsigned long)c[i]; fwrite(&tmp, sizeof(tmp), 1, fp); } のようにすればエンディアンに依存しないはずです。 どちらにしろ処理系依存にはなりますが…。
- notnot
- ベストアンサー率47% (4900/10358)
#1です。書き忘れ。 変数の半分だけ書くわけなので、endianというのが関係してきます。下位バイトを下位アドレスに入れるのがlittle-endianで、Windos等intel系システムならさっきの回答の通りですが、上位バイトを下位アドレスに入れるbig-endianの場合は、 fwrite(&c[i]+4,4,1,fp); 関数を使ってどちらの場合でも共通のソースにすることもできますけど、どうせ機種依存のプログラムでしょうからこれでいいと思います。