我有以下功能:
void IBinary::writeb( std::ostream& out, double x )
{
out.write( (char*)&(x), sizeof(double) );
}
这将获取x
的地址并将其强制转换为char*
类型的指针。我不明白write
的第一个参数是如何/为什么类型为char*
,即使我正在为文件写double
。 writeb
函数有几个重载,所有这些重载都转换为char*
。
这不等于:
double x = 3.14;
char* c;
c = (char*)&(x); // ah!
我猜这是有效的,因为我们也将double
的大小传递给ostream::write
。在我的计算机上,char
的大小是1个字节,但并不总是如此。
因此,无论编写什么类型的变量,为什么ostream::write
的第一个参数期望char*
?
答案 0 :(得分:2)
您是否查找了write的文档?
basic_ostream&安培; write(const char_type * s,std :: streamsize count);
第一个参数是const char_type* s
,这意味着std::ostream
您需要传递类型const char*
或char*
。 write
不接受任何其他类型。
现在,我个人将(char*)&(x)
写为reinterpret_cast<char*>(&x)
,但是将它放在一边,首先使用&
(地址运算符)获取对象的地址。接下来,将其投射到char*
。由于char
是一个字节,因此它会在count
中指定的字符数一次写入对象的一个字节。转换是存在的,因此对象可以传递给write
,因此它可以吐出对象的二进制表示,因为您一次只写一个字节。 char*
将指向对象的第一个字节,write
知道对象基于您传递sizeof(double)
作为第二个参数的大小字节数。
请注意,这是一种简单的序列化形式。
在我的计算机上,char的大小是1个字节,但这并不总是如此 是真的。
这是不正确的。 char
保证始终为一个字节。
答案 1 :(得分:1)
ostream::write
是unformatted output function。在这种情况下,未格式化意味着它盲目地写出你给它的任何字节。使用char *
是最好的(仅?)方式。