こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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関数に詳しい方,ご回答をよろしくお願いします。

投稿日時 - 2003-11-20 02:11:29

QNo.710306

困ってます

質問者が選んだベストアンサー

sizeof(c[i])が8ですから、8バイト(64bit)かかれます。
4バイト(32bit)だけ書きたいなら、
fwrite(&c[i],4,1,fp);

投稿日時 - 2003-11-20 02:15:28

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

#4です。

ファイルにどのように書かれているかは、バイナリエディタで調べればわかります。
こちらに各種ありますから、お好みのものを使って調べてください。
http://www.vector.co.jp/vpack/filearea/win95/util/bin/edit/by_trend.html

参考URL:http://www.vector.co.jp/vpack/filearea/win95/util/bin/edit/by_trend.html

投稿日時 - 2003-11-20 03:37:19

ANo.4

>実際に使用しているのは下位32bitです
それなら、long型を使えばよさそうですが??

>上位32bitの"0"も書出されていることになるのでしょうか。
そうです。64ビットの数値領域をそのまま書き出しています。

>計算間違いで32bitを超えたところまで何かデータが入っている可能性もあります。
ご質問の趣旨は、こういう場合には上位32ビットをクリアしたいということで
しょうか? それなら c[i] &= 0xffffffff; を行なってから書き出せば
いいかと思います。

いずれにしても、あまりfwrite()には関係がないと思いますが...

投稿日時 - 2003-11-20 03:32:07

ANo.3

#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);
}

のようにすればエンディアンに依存しないはずです。
どちらにしろ処理系依存にはなりますが…。

投稿日時 - 2003-11-20 03:17:56

ANo.2

#1です。書き忘れ。
変数の半分だけ書くわけなので、endianというのが関係してきます。下位バイトを下位アドレスに入れるのがlittle-endianで、Windos等intel系システムならさっきの回答の通りですが、上位バイトを下位アドレスに入れるbig-endianの場合は、
fwrite(&c[i]+4,4,1,fp);
関数を使ってどちらの場合でも共通のソースにすることもできますけど、どうせ機種依存のプログラムでしょうからこれでいいと思います。

投稿日時 - 2003-11-20 02:21:12

あなたにオススメの質問