void insert_into_stream(std::ostream& stream, int number)
{
int length = sizeof(int);
char insert_buffer[sizeof(int)];
memcpy(insert_buffer, &number, length);
stream.write(insert_buffer, length);
}
int int_from_string(std::string string)
{
int a;
std::istringstream(string)>>a;
return a;
}
此代码以前曾经工作过,我不记得我做了什么微小的改变而且它不再起作用了。 当一个数字(例如,8001)进来,并且我在最后一个语句之前进行调试时,insert_buffer包含'A',所以显然出现了错误,第二个函数没有检索到8001。
注意 - 我会在将流发送到第二个函数之前将其转换为字符串。
第一个函数在哪里错了?
--- ----编辑
是的,我错了,第一个功能实际上正是应该做的,第二个是错的,有人可以解决这个问题吗?
答案 0 :(得分:1)
这两个功能完全不同。
第一个函数是将整数的原始二进制表示写出到流中。
您刚刚复制了这些位,如果您要序列化为二进制文件,这是正确的做法。
要将其转换回来,您必须读取这4个字节,并将其转换为整数,就像您正在反过来一样。
当然,当你检查字符时,它们将是整数位的一个字节ascii表示。所以'A'是一个完全合理的东西,就像其它任何东西一样,因为它完全没有意义。
然而,第二个功能是进行ASCII数到整数的转换。即atoi
。这对于你要做的事情毫无意义,因为字符不是ascii数字,它们是二进制整数。
编辑编辑:你想要这样的东西,就像你上面做的那样。
int int_from_string(const char* number)
{
int a;
memcpy(&a, number, sizeof(int));
return a;
}
答案 1 :(得分:0)
尝试使用
stream.write((const char*)&number, sizeof(number));
它更短,您还可以更改数字的类型,它将起作用(对于简单类型)。