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 阅读双打时遇到任何类似问题的人!干杯