我有一个整数,我想将其序列化为二进制文件.我不关心跨平台.
我正在做以下事情:
std::ofstream f;
f.open(path, std::ios::binary);
int n = 200;
f.write((char*)&n, sizeof(int));
f.close()
Run Code Online (Sandbox Code Playgroud)
然后在我使用ifstream再次打开文件并将其所有内容读入字符向量后,我执行以下操作以获取整数:
char* ptr = avector.data();
int n = *ptr;
ptr += sizeof(int);
Run Code Online (Sandbox Code Playgroud)
这似乎仅在IF <= 127时起作用.当n> 127时,因为在这个例子中'n'得到一个奇怪的值而不是200.
在这段代码中:
char* ptr = avector.data();
int n = *ptr;
Run Code Online (Sandbox Code Playgroud)
您正在将一个字节转换为int
解除引用char
指针.你需要的是复制数据:
char* ptr = avector.data();
int n = 0;
memcpy( &n, ptr, sizeof(n) );
Run Code Online (Sandbox Code Playgroud)
要么:
char* ptr = avector.data();
int n = 0;
std::copy(ptr, ptr+sizeof(n), (char*)&n);
Run Code Online (Sandbox Code Playgroud)
您应该知道这不是便携式解决方案.
你不能做的是:
char* ptr = avector.data();
int n = *(int*)ptr;
Run Code Online (Sandbox Code Playgroud)
虽然它看起来很合理,并且会编译,但实际上很受欢迎,甚至可能看起来有效,但它违反了严格的别名规则.您可以查看对象 - 如果它是char[]
,但不是相反.无论可移植性如何,此处都需要副本.