ostream读/写功能
ostream read/write functions
我有以下功能:
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 *
是最好的(唯一的?)方法。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- ostream过载时的缓冲区冲洗
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 需要从 istream 和 ostream 派生 iostream
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- 使用嵌套功能时,Ostream输出会提供额外的地址
- ostream读/写功能