ostream读/写功能

时间:2013-07-19 20:11:56

标签: c++ file-io ostream

我有以下功能:

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

这将获取x的地址并将其强制转换为char*类型的指针。我不明白write的第一个参数是如何/为什么类型为char*,即使我正在为文件写doublewriteb函数有几个重载,所有这些重载都转换为char*

这不等于:

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

我猜这是有效的,因为我们也将double的大小传递给ostream::write。在我的计算机上,char的大小是1个字节,但并不总是如此。

因此,无论编写什么类型的变量,为什么ostream::write的第一个参数期望char*

2 个答案:

答案 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::writeunformatted output function。在这种情况下,未格式化意味着它盲目地写出你给它的任何字节。使用char *是最好的(仅?)方式。