Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 快速将无符号字符向量转换为POD结构向量,反之亦然_C++_File_Vector - Fatal编程技术网

C++ 快速将无符号字符向量转换为POD结构向量,反之亦然

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

我想读/写二进制数据,本质上是一个普通旧数据结构的向量

我设法用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.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;我如何编写不同类型的多个段?