我有一个整数,我想将其序列化为二进制文件。我不在乎跨平台。
我正在执行以下操作:
std::ofstream f;
f.open(path, std::ios::binary);
int n = 200;
f.write((char*)&n, sizeof(int));
f.close()
然后,我再次使用ifstream打开文件并将其所有内容读入chars向量后,执行以下操作以获取整数:
char* ptr = avector.data();
int n = *ptr;
ptr += sizeof(int);
这似乎仅在n <= 127时起作用。当n> 127时(如本例中所示),“ n”得到一个怪异的值而不是200。
答案 0 :(得分:6)
在此代码中:
char* ptr = avector.data();
int n = *ptr;
您正在将一个字节转换为int
引用的char
指针。相反,您需要复制数据:
char* ptr = avector.data();
int n = 0;
memcpy( &n, ptr, sizeof(n) );
或者:
char* ptr = avector.data();
int n = 0;
std::copy(ptr, ptr+sizeof(n), (char*)&n);
您应该意识到这不是便携式解决方案。
您不能要做的是:
char* ptr = avector.data();
int n = *(int*)ptr;
尽管它看起来很合理,并且可以编译,实际上很流行,甚至看起来可以运行,但是它违反了严格别名规则。您可以将其视为char[]
来查看它,但反之则不行。不论是否便携,这里都需要复制。