C++ ostream读/写函数
我有以下功能:C++ ostream读/写函数,c++,file-io,ostream,C++,File Io,Ostream,我有以下功能: 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
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*
,而不管编写的是哪种类型的变量?您是否查阅了文档
基本数据流和写入(常量字符类型*s,标准::流大小计数)
第一个参数是const char\u type*s
,这意味着对于std::ostream
您需要传递一个类型const char*
或char*
<代码>写入不接受任何其他类型
现在,我个人会将(char*)和(x)
写为重新解释(&x)
,但撇开它不谈,首先你要使用和(操作符的地址)获取对象的地址。接下来,将其强制转换为char*
。由于char
是一个字节,它一次写入对象的一个字节,即count
中指定的字符数。强制转换在那里,因此对象可以被传递到write
,因此它可以吐出对象的二进制表示,因为您一次只写一个字节。char*
将指向对象的第一个字节,write
知道对象有多少字节大,这取决于您将sizeof(double)
作为第二个参数传递
请注意,这是一种简单的序列化形式
在我的计算机上,字符的大小是1字节,但并不总是这样
是真的
这是不正确的char
保证始终为一个字节。您是否查阅了文档
基本数据流和写入(常量字符类型*s,标准::流大小计数)
第一个参数是const char\u type*s
,这意味着对于std::ostream
您需要传递一个类型const char*
或char*
<代码>写入
不接受任何其他类型
现在,我个人会将(char*)和(x)
写为重新解释(&x)
,但撇开它不谈,首先你要使用和(操作符的地址)获取对象的地址。接下来,将其强制转换为char*
。由于char
是一个字节,它一次写入对象的一个字节,即count
中指定的字符数。强制转换在那里,因此对象可以被传递到write
,因此它可以吐出对象的二进制表示,因为您一次只写一个字节。char*
将指向对象的第一个字节,write
知道对象有多少字节大,这取决于您将sizeof(double)
作为第二个参数传递
请注意,这是一种简单的序列化形式
在我的计算机上,字符的大小是1字节,但并不总是这样
是真的
这是不正确的char
保证始终为一个字节。ostream::write
是一个字节未格式化在这种情况下,意味着它盲目地写出你给它的任何字节。使用char*
是最好的(唯一的?)方法。ostream::write
是一种简单的方法未格式化在这种情况下,意味着它盲目地写出你给它的任何字节。使用char*
是最好的(唯一的?)方法。你的问题是什么?挑剔/FYI:sizeof(char)
定义为1字节。编译器看到的“字节”可能不完全是8位,具体取决于您的系统。请记住,这是指向char
的指针,而不仅仅是char
。指针c
指向示例中对象的第一个字节。您的问题是什么?挑剔/FYI:sizeof(char)
定义为1个字节。编译器看到的“字节”可能不完全是8位,具体取决于您的系统。请记住,这是指向char
的指针,而不仅仅是char
。指针<代码>代码>代码>指向您示例中对象的第一个字节。我同意应该更新函数以使用C++样式转换。我看到了关于sizeof(char)
为1的混合答案。考虑到这一点,我们只需使用<代码> char < /> >写出一个字节的任何类型。@德里克:是的,完全正确。我同意应该更新函数以使用C++样式转换。我看到了关于sizeof(char)
为1的混合答案。考虑到这一点,我们只是简单地使用char
逐字节写出哪种类型?@Derek:是的,没错。