我通常使用stringstream
来写入内存中的字符串。有没有一种方法可以在二进制模式下写入字符缓冲区?考虑以下代码:
stringstream s;
s << 1 << 2 << 3;
const char* ch = s.str().c_str();
字符串ch
的内存看起来像这样:0x 313233-字符1,2和3的ASCII代码。我正在寻找一种方法来写入二进制值本身。也就是说,我希望内存中有0x 010203。问题是我希望能够编写函数
void f(ostream& os)
{
os << 1 << 2 << 3;
}
型
并在外部决定使用哪种流。类似于以下内容:
mycharstream c;
c << 1 << 2 << 3; // c.data == 0x313233;
mybinstream b;
b << 1 << 2 << 3; // b.data == 0x010203;
型
有什么想法吗?
7条答案
按热度按时间watbbzwu1#
要向流(包括stringstreams)读写二进制数据,请使用read()和write()成员函数。
字符串
在我的系统上,这会产生
0x4030201
。编辑:要使用插入和提取操作符(< >)使其透明地工作< and >,您最好创建一个执行正确操作的派生streambuf,并将其传递给您想要使用的任何流。
yk9xbfzb2#
你可以用模板来做这类事情。例如:
字符串
它可能需要一些清理,但它的功能。例如:
型
up9lanfz3#
好吧,只使用字符,而不是整数。
字符串
yduiuuwa4#
重载一些不常见的运算符效果相当好。下面我选择重载**<=,因为它与<<**具有相同的从左到右的结合性,并且在某种程度上具有接近的外观和感觉。
字符串
有几个缺点:
型
不会给予和
型
型
lg40wkob5#
对于这个用例,我自己实现了一个“原始移位运算符”:
字符串
把它放在方便的地方,像这样使用它:
型
优点:
sizeof()
缺点:
jexiocij6#
我真的很喜欢韩洛的方法,并且已经验证了它工作得很好!如果将oss成员变量改为使用std::stringstream (vs. ostingstream),这个类也可以用于使用重载的流提取操作符进行提取,如下所示:
字符串
示例模板支持整型,如果为std::is_compound添加一个新的模板,也可以支持std::map这样的类型。对于std::vector这样的“is_fundemental”类型,我建议先将大小推送到流中,这样在提取端就可以知道之后要提取多少元素。这种方法可以很好地处理常见的std::vector和std::map类型。
ct3nt3jp7#
字符串
范例:
型
不是一个优雅的解决方案,但工作和灵活
编辑: