私は、いくつかの異なるオペレーティングシステムとコンピュータで書き込まれ、読み込まれるべきファイル形式に取り組んでいます。これらのコンピュータの中には、x86マシンでなければならないものもあれば、x86-64でもあるものもあります。いくつかの他のプロセッサが存在するかもしれませんが、私はそれらについて心配していませんまだ。Cコードでのlong int値の書き込みと読み込み
このファイル形式は次のように読まれることになるいくつかの数字を含める必要があります。これは私のコンピュータ上で動作しているようだが、私は心配
void writeLong(long x, FILE* f){
long* xptr = &x;
LongAsChars* lng = (LongAsChars*) xptr;
fputc(lng->c1, f);
fputc(lng->c2, f);
fputc(lng->c3, f);
fputc(lng->c4, f);
}
:として
struct LongAsChars{
char c1, c2, c3, c4;
};
long readLong(FILE* file){
int b1 = fgetc(file);
int b2 = fgetc(file);
int b3 = fgetc(file);
int b4 = fgetc(file);
if(b1<0||b2<0||b3<0||b4<0){
//throwError
}
LongAsChars lng;
lng.c1 = (char) b1;
lng.c2 = (char) b2;
lng.c3 = (char) b3;
lng.c4 = (char) b4;
long* value = (long*) &lng;
return *value;
}
と書かれたがそれは他人にはないかもしれないし、ファイル形式がコンピュータ間で異なってしまうかもしれないということです(例えば32ビット対64ビットコンピュータ)。 何か間違っていますか?数字ごとに一定のバイト数を使用するようにコードを実装するにはどうすればよいですか?
freadを使用するだけでいいですか(代わりに私のコードも速くなります)?
@GMan - ないあなたの時間(同じプラットフォームのエンディアンに基づいて条件付きで別の定義をコンパイルしない限り)ユニオンで同じ問題が発生しますか? –
stdintへの参照は非常に役に立ち、多くの助けになります! – luiscubal
符号なしの文字または符号拡張を使用するとあなたが噛み付きます。 –