0

我有以下功能:

void IBinary::writeb( std::ostream& out, double x )
{
   out.write( (char*)&(x), sizeof(double) );
}

这将获取 的地址x并将其转换为 type 的指针char*。我不明白第一个参数如何/为什么write是 type char*,即使我正在将 a 写入double文件。writeb该函数有几个重载,所有重载都转换为char*.

那不就相当于:

double x = 3.14;
char* c;
c = (char*)&(x);    // ah!

我的猜测是这行得通,因为我们也传递了doubleto的大小ostream::write。在我的计算机上,大小char为 1 字节,但这并不总是正确的。

因此,为什么无论写入什么类型的变量, ostream::writeexpect的第一个参数都是?char*

4

2 回答 2

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*. 由于 achar是一个字节,它一次写入对象的一个​​字节,其中指定的字符数为count. 演员表在那里,以便可以将对象传递给write它,因此它可以吐出对象的二进制表示,因为您一次写入一个字节。将char*指向对象的第一个字节,并根据您作为第二个参数write传递来知道对象有多少字节。sizeof(double)

请注意,这是一种简单的序列化形式。

在我的计算机上,char 的大小是 1 个字节,但这并不总是正确的。

这是不正确的。char保证总是一个字节。

于 2013-07-19T20:42:14.473 回答
1

ostream::write是一个未格式化的输出函数在这种情况下未格式化意味着它会盲目地写出你给它的任何字节。使用 achar *是最好的(唯一的?)方法。

于 2013-07-19T20:42:43.423 回答