ostream读/写功能

ostream read/write functions

本文关键字:功能 ostream      更新时间:2023-10-16

我有以下功能:

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 *是最好的(唯一的?)方法。