C++ ifstream 以双精度读取
C++ ifstream reading in a double
场景:
所以我正在将二进制文件读入 ifstream 中。
文件中的数据包括字符串和双精度数。
我必须跟踪我读取了多少字节,这样我就不会脱离字符串/双精度定义。
问题:
怎么读进去的数据好像都是垃圾或者0。
我已经通过另一个读取此特定格式的应用程序验证了二进制文件的质量。
当前方法:
ifstream in;
in.open(path, ios::binary);
char * valueBytes = new char[8];
ifs.read((char*)valueBytes,8);
有什么想法吗?
解决方案:
这是一个多层次的问题! D:
第一期
doubles 在二进制流中存储为 long int(与您看到的字节大小相同)。所以每次直接尝试提取双数都失败了。只好搬家先抽长了。
所以代码从 char * 缓冲区中读取 long
long readLongLittleEndian(char * readBuffer, int length) {
long value =
static_cast<uint64_t>(readBuffer[0]) << 0|
static_cast<uint64_t>(readBuffer[1]) << 8 |
static_cast<uint64_t>(readBuffer[2]) << 16 |
static_cast<uint64_t>(readBuffer[3]) << 24 |
static_cast<uint64_t>(readBuffer[4]) << 32 |
static_cast<uint64_t>(readBuffer[5]) << 40 |
static_cast<uint64_t>(readBuffer[6]) << 48 |
static_cast<uint64_t>(readBuffer[7]) << 56;
return value;
}
第二期
Big Endian vs Little Endian!朵:!!
描述此问题的文章:http://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/
我的应用程序文件似乎使用的是 Big Endian。所以我也要做这个。
long readLongBigEndian(char * readBuffer, int length) {
long value =
(((long)readBuffer[0] << 56) +
((long)(readBuffer[1] & 255) << 48) +
((long)(readBuffer[2] & 255) << 40) +
((long)(readBuffer[3] & 255) << 32) +
((long)(readBuffer[4] & 255) << 24) +
((readBuffer[5] & 255) << 16) +
((readBuffer[6] & 255) << 8) +
((readBuffer[7] & 255) << 0));
return value;
}
第三期:
将长整型转换为双精度型。现在我尝试了标准铸造和其他方法,但由于某种原因失败了。以下每次都有效
double longBitsToDouble(long d)
{
double * pl = reinterpret_cast<double*>(&d);
return *pl;
}
我希望这可以帮助任何在使用 ifstream 阅读双打时遇到任何类似问题的人!干杯
场景:
所以我正在将二进制文件读入 ifstream 中。 文件中的数据包括字符串和双精度数。 我必须跟踪我读取了多少字节,这样我就不会脱离字符串/双精度定义。
问题:
怎么读进去的数据好像都是垃圾或者0。 我已经通过另一个读取此特定格式的应用程序验证了二进制文件的质量。
当前方法:
ifstream in;
in.open(path, ios::binary);
char * valueBytes = new char[8];
ifs.read((char*)valueBytes,8);
有什么想法吗?
解决方案:
这是一个多层次的问题! D:
第一期
doubles 在二进制流中存储为 long int(与您看到的字节大小相同)。所以每次直接尝试提取双数都失败了。只好搬家先抽长了。
所以代码从 char * 缓冲区中读取 long
long readLongLittleEndian(char * readBuffer, int length) {
long value =
static_cast<uint64_t>(readBuffer[0]) << 0|
static_cast<uint64_t>(readBuffer[1]) << 8 |
static_cast<uint64_t>(readBuffer[2]) << 16 |
static_cast<uint64_t>(readBuffer[3]) << 24 |
static_cast<uint64_t>(readBuffer[4]) << 32 |
static_cast<uint64_t>(readBuffer[5]) << 40 |
static_cast<uint64_t>(readBuffer[6]) << 48 |
static_cast<uint64_t>(readBuffer[7]) << 56;
return value;
}
第二期
Big Endian vs Little Endian!朵:!! 描述此问题的文章:http://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/ 我的应用程序文件似乎使用的是 Big Endian。所以我也要做这个。
long readLongBigEndian(char * readBuffer, int length) {
long value =
(((long)readBuffer[0] << 56) +
((long)(readBuffer[1] & 255) << 48) +
((long)(readBuffer[2] & 255) << 40) +
((long)(readBuffer[3] & 255) << 32) +
((long)(readBuffer[4] & 255) << 24) +
((readBuffer[5] & 255) << 16) +
((readBuffer[6] & 255) << 8) +
((readBuffer[7] & 255) << 0));
return value;
}
第三期:
将长整型转换为双精度型。现在我尝试了标准铸造和其他方法,但由于某种原因失败了。以下每次都有效
double longBitsToDouble(long d)
{
double * pl = reinterpret_cast<double*>(&d);
return *pl;
}
我希望这可以帮助任何在使用 ifstream 阅读双打时遇到任何类似问题的人!干杯