C++ 快速将无符号字符向量转换为POD结构向量,反之亦然
我想读/写二进制数据,本质上是一个普通旧数据结构的向量 我设法用char数组实现了这一点,但现在我需要将这些数组来回转换为struct向量 我已经通过直接读取/写入文件来做到这一点:C++ 快速将无符号字符向量转换为POD结构向量,反之亦然,c++,file,vector,C++,File,Vector,我想读/写二进制数据,本质上是一个普通旧数据结构的向量 我设法用char数组实现了这一点,但现在我需要将这些数组来回转换为struct向量 我已经通过直接读取/写入文件来做到这一点: int main() { struct thing { float f; char c; }; std::vector<thing> write_this = { {2,'c'},{5,'f'},{543,'e'} }; std::ofstream outfile{ "test
int main() {
struct thing { float f; char c; };
std::vector<thing> write_this = { {2,'c'},{5,'f'},{543,'e'} };
std::ofstream outfile{ "test.bin", std::ios::binary };
outfile.write(reinterpret_cast<const char *>(write_this.data()),
write_this.size() * sizeof(decltype(write_this)::value_type));
outfile.close();
std::vector<thing> result(3);
std::ifstream infile{ "test.bin", std::ios::binary };
infile.read(reinterpret_cast<char *>(result.data()),
result.size() * sizeof(thing));
for (auto& i : result)
std::cout << i.f << " " << i.c << ' ';
std::cout << '\n';
system("PAUSE");
return 0;
}
intmain(){
结构物{float f;char c;};
向量write_this={{2,'c'},{5,'f'},{543,'e'};
std::ofstreamoutfile{“test.bin”,std::ios::binary};
outfile.write(重新解释转换(write\u this.data()),
write_this.size()*sizeof(decltype(write_this)::value_type);
outfile.close();
std::向量结果(3);
std::ifstream infle{“test.bin”,std::ios::binary};
infle.read(重新解释强制转换(result.data()),
result.size()*sizeof(thing));
用于(自动和输入:结果)
std::cout前言:请注意,写入的数据不能移植到其他系统,对于某些POD(包含位字段的POD),甚至不能移植到由不同编译器编译的同一系统上的其他进程,除非这些系统以某种方式保证具有相同的二进制表示
此外,写入数据中的内存引用对其他进程来说毫无意义,甚至对同一程序的单独执行也是如此
快速将无符号字符向量转换为POD结构向量,反之亦然
您可以这样做:
static_assert(std::is_trivial_v<thing>);
constexpr int s = sizeof(thing);
int n = 3;
std::vector<unsigned char> result_raw(n * s);
unsigned char* data = result_raw.data();
infile.read(reinterpret_cast<char*>(data), n * s);
// ->
for(int i = 0; i < n; i++) {
unsigned char temp[s];
unsigned char* addr = data + i * s;
std::memcpy(temp, addr, s);
new (addr) thing;
std::memcpy(addr, temp, s);
}
thing* result = std::launder(reinterpret_cast<thing*>(data));
// <-
static\u assert(std::is\u triple\u v);
constexpr int s=sizeof(事物);
int n=3;
std::向量结果_原始值(n*s);
unsigned char*data=result_raw.data();
填充读取(重新解释铸件(数据),n*s);
// ->
对于(int i=0;i //简短回答:不要。直接写和读段。否则你必须memcpy
从char向量到structs向量。你发布的代码对我来说很好。你有什么问题吗?没有,我只是想把一个向量转换成向量,像这样的POD结构代码是不可移植的。例如,并非所有编译器都对您的结构使用相同的对齐方式。
。如果您真的想编写这样的代码,至少要添加一些检查,如static\u assert(sizeof thing==8,“此代码仅工作,id数据对齐为4字节”);
@NathanOliver;我如何编写不同类型的多个段?