C++ 为什么以及如何写入和读取二进制文件?

C++ 为什么以及如何写入和读取二进制文件?,c++,binary,binaryfiles,C++,Binary,Binaryfiles,我的业余爱好是编写一个游戏项目,目前我需要将一些资源数据(.BMPs)存储到我自己的文件格式中,以便我的游戏可以解析所有数据并加载到屏幕中 为了读取BMP,我先读取标题,然后读取每个像素的RGB数据,我有一个数组[width][height]来存储这些值 有人告诉我应该用二进制保存这些类型的数据,但不是原因。我已经读过关于二进制以及它是什么(数据的0-1表示),但是为什么我要用它来保存一个.BMP数据呢? 如果我以后在游戏中阅读它,它不只是增加了更多的复杂性,甚至可能会减慢加载过程吗 和最后,如

我的业余爱好是编写一个游戏项目,目前我需要将一些资源数据(.BMPs)存储到我自己的文件格式中,以便我的游戏可以解析所有数据并加载到屏幕中

为了读取BMP,我先读取标题,然后读取每个像素的RGB数据,我有一个数组[width][height]来存储这些值

有人告诉我应该用二进制保存这些类型的数据,但不是原因。我已经读过关于二进制以及它是什么(数据的0-1表示),但是为什么我要用它来保存一个.BMP数据呢? 如果我以后在游戏中阅读它,它不只是增加了更多的复杂性,甚至可能会减慢加载过程吗

<>和最后,如果在二进制中保存更好(我猜是这样,看每个人似乎都是从我在其他游戏资源文件中研究的),我如何在C++中读写二进制文件?
我看到了很多问题,但是对于许多不同类型的变量,有很多不同的方法,所以我想问,哪种方法是最好的/更像C++的方法?

你完全颠倒过来了。计算机处理器处理二进制数据。计算机中的一切都是二进制的。为了以人类可读的形式处理数据,我们编写了一些函数,使二进制数据看起来像人类理解的东西。因此,如果您将.BMP数据以文本形式存储在文件中,实际上您正在让计算机做更多的工作,将.BMP数据从其自然二进制形式转换为文本,然后从其文本形式转换回二进制形式以显示它

事实是,处理原始二进制形式的数据越多,代码运行的速度就越快。更少的转换意味着更快的代码。但显然有一个折衷办法:如果您需要能够查看数据并理解它,而不需要拿出一个神奇的解码环,那么您可能希望将其作为文本存储在一个文件中。但在这样做的过程中,我们必须理解,必须进行转换处理,以使人类可读的文本对处理器有意义,正如我所说,处理器只对纯二进制数据进行操作


如果你已经知道或者有点知道,你的问题是“为什么我应该以二进制模式而不是文本模式打开我的.bmp文件”,那么原因是以文本模式打开文件会要求平台根据平台的需要执行CRLF到LF的转换(“\r\n”-到-“\n”的转换),因此,在内部字符串处理级别,您要处理的只是“\n”字符。如果文件由二进制数据组成,则不希望进行转换,否则在读取文件时会损坏文件中的数据。在这种状态下,大多数数据都可以正常工作,大多数情况下情况都可以正常工作,但有时您会遇到一对十六进制形式的字节0x0d、0x0a(十进制13,10),这些字节将转换为0x0a(10),并且您读取的数据中会缺少一个字节。因此,请确保以二进制模式打开二进制文件


好的,根据你最近的评论(如下),这里是:

正如您(现在?)所理解的,计算机中的数据是以二进制格式存储的。是的,这意味着它在0和1之间。然而,在编程时,您实际上不必亲自处理0和1,除非您出于某种原因正在进行位逻辑运算。例如,
int
类型的变量是单个位的集合,每个位可以是0或1。它也是字节的集合,假设一个字节中有8位,那么一个
int
中通常有2、4或8个字节,具体取决于您的平台和编译器选项。但是,您可以将该
int
作为
int
进行处理,而不是作为单个0和1进行处理。如果将
int
以最纯的形式写入文件,字节(以及位)将以未转换的原始形式写入。但您也可以将它们转换为ASCII文本并以这种方式写出。如果您在屏幕上显示一个
int
,您当然不想看到单独的0和1,因此您以ASCII格式打印它,通常解码为十进制数。您可以同样轻松地以十六进制形式打印相同的
int
,即使是相同的数字,结果也会有所不同。例如,在decimal中,您可能具有十进制值65。十六进制中的相同值是0x41(或者,如果我们理解它在基数16中,则仅为41)。同样的值是字母“A”,如果我们以ASCII的形式显示它(只考虑2、4、8字节或8字节<代码> INT/COD>的低位字节,即将其视为<代码> char < /代码>)。

在本次讨论的其余部分中,忘记我们讨论的是<代码> int /代码>,现在考虑我们讨论的是<代码> char < />代码,或者1字节(8位)。假设我们仍然有相同的值,65,或0x41,或'A',不管你想看它。如果要将该值发送到文件,可以将其以原始形式发送,也可以将其转换为文本形式。如果以原始形式发送,它将占用文件中的8位(一个字节)。但是,如果您想以文本形式将其写入文件,则需要将其转换为ASCII,这取决于您想将其写入的格式和实际值(本例中为65),它将占用1、2或3个字节。假设您想用十进制ASCII编写它,不带填充字符。然后,值65将占用2个字节:一个用于“6”,一个用于“5”。如果要以十六进制形式打印,它仍将占用2个字节:一个用于“4”,一个用于“1”,除非在它前面加上“0x”,在这种情况下,它将占用4个字节,一个用于“0”,一个用于“x”,一个用于“4”,另一个用于“1”。或者假设您的

char
是值255(char的最大值):如果我们将其以分贝的形式写入文件