Есть некоторые дискуссии по тому же вопросу, но я хотел бы задать еще несколько,
1) Насколько переносим код ниже для двухбайтовой замены
int ReadDouble(FILE *fptr,double *n)
{
unsigned char *cptr,tmp;
if (fread(n,8,1,fptr) != 1)
return(FALSE);
cptr = (unsigned char *)n;
tmp = cptr[0];
cptr[0] = cptr[7];
cptr[7] = tmp;
tmp = cptr[1];
cptr[1] = cptr[6];
cptr[6] = tmp;
tmp = cptr[2];
cptr[2] = cptr[5];
cptr[5] =tmp;
tmp = cptr[3];
cptr[3] = cptr[4];
cptr[4] = tmp;
return(TRUE);
}
2) Должен ли я сохранить 3 важные части числа с плавающей запятой, знаковый бит, мантиссу, экспоненту как целые числа, а затем попытаться каким-то образом ими манипулировать.
Я знаю основы представлений с плавающей запятой, не так глубоко, как инженер-механик, однако мне нужно прочитать какой-нибудь файл с прямым порядком байтов, в котором моя машина имеет порядок байтов. Позже я могу беспокоиться о проблемах переносимости. Но я хотел бы узнать о них, возможно, вы можете направить меня к более прямым вещам по этому вопросу, потому что об этом слишком много информации, и я не понял, что читать.
Так что после некоторых комментариев это должно более или менее сделать это портативным способом, верно? Извините за указатели файла C ...
double_t ReadDouble(ifstream& source) {
// read
char buf[sizeof(double_t)];
source.read(buf, sizeof(double_t));
// reverse and return
reverse( buf, buf+sizeof(double_t) );
return *(reinterpret_cast<double_t*>(buf));
}
Best,
Умут