为什么文件中数组的二进制保存有效? [C ++]

时间:2011-02-04 17:13:16

标签: c++ arrays file binary export

C ++ newbie here。

我正在试图找出将缓冲区写入文件的以下行:

fOut.write((char *)&_data, sizeof(_data));

_data =整数数组......

我有几个问题:

  1. &_data是数组第一个元素的地址吗?
  2. 无论地址是什么,这是否意味着我们只保存数组的地址?那么为什么我在释放后仍然可以访问阵列呢?
  3. 我不应该通过sizeof(_data)*arrLength吗?传递int的大小(在本例中)是什么意思,而不是整个数组的大小?
  4. 在处理地址时,投射到char*意味着什么?
  5. 我真的很感激一些澄清。

6 个答案:

答案 0 :(得分:6)

与您的评论相反,数组必须是自动或静态存储持续时间才能使sizeof正常工作。

  1. 应该只是(char*)_data。数组的名称隐式转换为指向第一个元素的指针。

  2. 不,write需要指针,并存储在该位置找到的内容,而不是位置的地址。

  3. 没有。由于_data是一个数组,sizeof (_data)是数组中所有元素的累积大小。如果_data是指针(例如在堆上动态分配数组时),则需要numElems * sizeof(_data[0])。将指针的大小乘以元素的数量是没有用的。

  4. 这意味着该地址的内容将被视为一系列单独的字节,从而失去了它可能具有的任何数字含义。通常这样做是为了从文件或memcpy / memmove执行数据的高效批量复制。数据类型应为POD(普通旧数据),否则您将获得意外结果。

  5. 如果_data是指向从堆分配的数组的指针,正如您的注释所示,那么代码就会被严重破坏。在这种情况下,您只保存地址,如果您将文件加载回程序的同一个实例,它可能会起作用,但这仅仅是因为它在同一地址的内存中查找数据。数据实际上不在文件中,如果在加载文件之前重新启动程序,则会发现数据已消失。进行我在(1)和(3)中提到的更改,以便保存完整的数组,无论它是自动,静态还是动态分配。

答案 1 :(得分:1)

  

铸造成char *意味着什么   在处理地址时?

想象一下这个简单的例子

int x = 12;
char * z = (char *)&x;

并假设int长度为4个字节的架构。来自C ++标准sizeof(char)==1

在表达式char * z char *部分,您可以说它用于指针运算

在我给出的示例的第二行,会发生的事情是z现在指向x具有的第一个(4个字节中)。执行++z;会使z指向(在我的示例中)4字节int

的第二个字节

你可以说声明的左边部分用于指针算术,以简化操作。 a ++(char *)会移动一个字节,而++(int *)会移动你占用内存的相应字节数int

答案 2 :(得分:0)

  1. 不,write使用此地址作为第一个位置,并通过sizeof(_data)读取整个数组
  2. sizeof(_data)将返回整个数组的大小,与sizeof(int)不同
  3. 表示数据将逐字节读取,这是写入时所需的指针,因为它以二进制格式(逐字节)写入

答案 3 :(得分:0)

  

是& _data到数组第一个元素的地址吗?

是的,确实如此。 这是在C和C ++中将“引用”传递给数组的常用方法。如果您将数组本身作为参数传递,则会复制整个数组内容,这通常是浪费和不必要的。 更正:您可以传递&_data,或只是_data。无论哪种方式,都不需要将数组复制到堆栈中。

  

无论地址是什么,这是否意味着我们只保存数组的地址?那么为什么我从内存中删除他后仍然可以访问数组?

不,该方法使用它获取的地址来读取数组内容;正如你所指出的,只是保存内存地址毫无意义。

  

我不应该传递sizeof(_data)* arrLength吗?我的意思是...   传递大小的逻辑是什么   int(在这种情况下)而不是大小   整个阵列?

不,sizeof(_data)是数组的大小,而不是一个成员的大小。无需乘以长度。

  

在处理地址时,铸造成char *意味着什么?

转换为char *表示该数组作为字节列表进行访问;这是访问和写入原始值所必需的。

答案 4 :(得分:0)

1)是的,& _data是数组第一个元素的地址 2)否,write()通过sizeof(_data)从地址& _data开始写入您指定的数字字节。 3)如果_data是一个指针,你可以将sizeof(int)* arrLength传递给一个数组,但由于它一个数组sizeof()返回正确的大小。 /> 4)不知道。 ;)

答案 5 :(得分:0)

请阅读:http://www.cplusplus.com/reference/iostream/ostream/write/

  1. 应该是。
  2. 如果你调用“fstream.write(a,b)”,那么它会将从位置a开始的b个字节写入文件(即地址指向的位置);
  3. 应该是以字节或字符为单位的大小。
  4. 并不多,类似于在更文明的语言中将字节转换为byte []。
  5. 顺便说一句,它只适用于内部具有简单值的简单数组......

    我建议您查看>> <<运营商。