将unsigned int写入二进制文件

时间:2013-06-12 03:38:27

标签: c++

我第一次使用二进制文件,手上有一团头发。无论如何,我有以下定义:

unsigned int cols, rows;

这些变量可以是1到500左右。当我将它们写入二进制文件时,我这样做:

    myFile.write(reinterpret_cast<const char *>(&cols), sizeof(cols));
    myFile.write(reinterpret_cast<const char *>(&rows), sizeof(rows));

当我回去阅读cols = 300上的文件时,我得到了结果:

44
1
0
0

有人可以向我解释为什么我会得到这个结果吗?我不能说有什么不对的,因为老实说,我认为这是我不理解的事情。我想要做的就是将值存储在文件中,这样当我读回它时,我也会得到它。也许我这样做,我只是不知道。

我想解释一下这是如何工作的,以及如何获取我回读的数据。

4 个答案:

答案 0 :(得分:2)

您还没有(还)展示了如何解组数据以及如何打印您引用的文本。 44 01 00 00看起来像您编写的数据的每个小端字节的字节十进制表示形式(十进制“300”)。< / p>

如果你像这样读回数据,它应该给你想要的效果(假设你没有写入这个文件的计算机与读回它的那个相同的字节序的限制):

unsigned int colsReadFromFile = 0;
myOtherFile.read(reinterpret_cast<char *>(&colsReadFromFile), sizeof(colsReadFromFile));
if (!myOtherFile)
{
    std::cerr << "Oh noes!" << std::endl;
}

答案 1 :(得分:2)

您只是查看32位整数的四个字节,在little-endian平台上进行解释。

300 base 10 = 0x12C

所以little-endianness为您提供0x2C 0x01,当然还有0x2C=44

答案 2 :(得分:2)

文件中的每个字节都有8位,因此可以表示0到255之间的值。它以小端顺序写入,首先是低字节。因此,从另一端开始,将数字视为基数256中的数字。值为0 * 256 ^ 3 + 0 * 256 ^ 2 + 1 * 256 ^ 1 + 44 * 256 ^ 0(其中^表示取幂,不是XOR)。

答案 3 :(得分:1)

    300 in binary is 100101100 which is 9 bits long.

但是当你说char *时,编译器只查找前1个字节(8位)

    so it is 00101100(bits) of (1 00101100) = 44
                                  ^^^^^^^^