我有以下功能:
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*
?
您查找了要编写的文档吗?
基本流&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)
作为第二个参数来知道对象有多少字节大。
请注意,这是一种简单的序列化形式。
在我的电脑上,字符的大小是1字节,但这并不总是正确的说实话。
这是不正确的。保证CCD_ 28总是一个字节。
ostream::write
是一个未格式化的输出函数在这种情况下,未格式化意味着它盲目地写出你给它的任何字节。使用char *
是最好的(唯一的?)方法。