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

解決済みの質問

同じデータファイルなのに、linuxとMacで値が違ってしまうのはなぜ?

職場でlinux(初心者です), 自宅でMacを使っています。
同じCプログラムを使って、同じバイナリデータファイルから数値を読み出したところ、職場のlinuxでやった場合と自宅のMacでやった場合では、違う値が出てきてしまいます。読み込むデータは1byteのバイナリなので、エンディアンは関係ないと思うのですが、ほかに原因があるのでしょうか?そばに詳しい人がおらず、困っています。どうしてこういうことが起きるのか、また、どうやったら解決できるのか、どなたか詳しい方、ぜひアドバイスをお願いします。

以下、プログラムの説明とプログラムの一部です。
バイナリデータファイルから、dposition[i]番目の1byteのデータをそれぞれ読み込み、それぞれ別の出力ファイルfo[i]に書き込みます。dposition[i]はPOSITION_NUM個あり、従って、出力ファイルもPOSITION_NUM個用意しています。dposition[i]で指定した場所はとびとびの不連続な場所です。データを読み込むときは、0番目から、一番大きいdposition[i]番目(=maxnum番目)のデータまで、すべてをarray[datanum]に読み込み、書き出すときにdposition[i]番目のデータのみを書き出すよう指定しています。読み込むバイナリファイルはFILE_NUM個あり、すべて同じ形式です。順次開いて読み込み出力を繰り返します。以下プログラムの一部です。
for (j = 0; j < FILE_NUM; j++)
{
if(NULL == (fi = fopen(fn_in[j],"rb")))
{
printf("Cannot open input BISE File\n");
exit(1);
}
for (datanum = 0; datanum < maxnum+1; datanum++)
{
array[datanum] = fgetc(fi);
}
for (i = 0; i < POSITION_NUM; i++)
{
fprintf(fo[i],"%d\n",array[dposition[i]]);
}
fclose (fi);
}

以下、linuxでやった場合の出力を左、Maxでやった場合の出力を右に並べて書きます。
104 104
100 100
74  22
83  83
60  60
0   0
106 106
79  33
167 167
182 182
180 0
188 188
... ...
3,8,11番目が違う数字が出力されます。繰り返しますが、プログラムと入力ファイルは同じものです。

linuxでもMacでもターミナルでコンパイル、実行しています。
コンパイラのバージョンは、gccで検索したらなんだかたくさん出てきてしまって、どれが使っているコンパイラのバージョンなのかよくわかりませんでした。
ちなみに、MacはIntel系の方です。

ほか、アドバイスいただくにあたって、何か必要な情報があればご指摘ください。

ぜひよろしくおねがいします。

投稿日時 - 2008-06-12 23:36:11

QNo.4096301

すぐに回答ほしいです

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

バイナリファイルの実際の内容はどうなっているのでしょうか?

macとlinuxで結果が異なるということよりも、どちらが間違っているのか、あるいは両方とも間違っているのか、どうなんでしょう。

投稿日時 - 2008-06-13 11:01:42

お礼

odというコマンドでバイナリの中身が直接みられることがわかり、確かめてみました。すると、macとlinuxでは、そもそもインプットファイルの該当部分の値が違ってることがわかりました。。。
全く同じファイルをコピーして使ったはずなんですが。。。
インプットファイルをコピーし直してやり直したら、どちらのPCでもちゃんと同じ値がでてきました。

しょうもない理由ですみませんっっ

皆さん、いろいろとお返事どうもありがとうございましたm(_ _)m

投稿日時 - 2008-06-14 11:51:25

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

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

回答(4)

ANo.4

大前提として「Mac と Linux で同じ内容として読み込めている」のであれば, #2 にあるように dposition の値があやしいような気がします.
ちなみに gcc のバージョンは
gcc -v
と実行したときの最後の行にあります.

投稿日時 - 2008-06-13 17:56:53

お礼

odというコマンドでバイナリの中身が直接みられることがわかったので、インプットファイルの中身を確かめてみたら、そもそも両PCでインプットファイルの該当部分が違ってることがわかりました。。。
同じファイルをコピーしたはずなんですが。。。
しょうもない理由ですみませんっ!

gcc -v の情報、ありがとうございます。
一つ勉強になりました。

お返事どうもありがとうございましたm(_ _)m

投稿日時 - 2008-06-14 11:58:48

ANo.3

>linuxでやった場合の出力を左、Maxでやった場合の出力

これはエディタで閲覧したものか、10進数表記したものどちら?
あなたはバイナリファイルと言っている。そしてrbモードでオープンしている。しかし読み書きはfgetc,fprintfを用いている。

投稿日時 - 2008-06-13 17:33:06

お礼

odというコマンドでバイナリの中身が直接みられることがわかったので、インプットファイルの該当部分の値を確かめてみたところ、両PCでそもそもインプットファイルの該当部分の値が違ってることがわかりました。。。
全く同じファイルをコピーして使ったはずなんですが。。。
しょうもない理由ですみませんっっ

ちなみに、インプットはバイナリ、アウトプットは10進数表示のテキストで、表示した値はテキストのアウトプットファイルの中身でした。

お返事どうもありがとうございましたm(_ _)m

投稿日時 - 2008-06-14 11:56:06

ANo.2

dposition[ ] 配列の中身がlinuxとMacで違うとしか思えません
fprintf(fo[i],"%d\n",array[dposition[i]]);

fprintf(fo[i],"dposition=%d:%d\n", dposition[i], array[dposition[i]]);
にして確認してみては

投稿日時 - 2008-06-13 11:05:36

お礼

odというコマンドでバイナリの中身が直接みられることがわかったので、アドバイスいただいた方法でdpositionの中身を確かめ、インプットファイルの該当部分の値を確かめてみました。すると、macとlinuxでは、そもそもインプットファイルの該当部分の値が違ってることがわかりました。。。
全く同じファイルをコピーして使ったはずなんですが。。。

しょうもない理由ですみませんっっ

お返事どうもありがとうございましたm(_ _)m

投稿日時 - 2008-06-14 11:53:44

あなたにオススメの質問