Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ostream读/写函数_C++_File Io_Ostream - Fatal编程技术网

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:是的,没错。