c++ - 将“std::vector<unsigned char>”的内容保存到文件中

Edu*_*cio 4 c++ byte vector bit

我使用“writeFileBytes”下面的函数std::vector<unsigned char>将 a的内容写入文件。我想使用“无符号字符”类型来保存文件(请注意,这是为“字符”进行的强制转换)。这个问题的原因是因为“无符号字符”与任何字节(例如“00000000”位)兼容。当我们使用“char”时,我们在操作某些“无效”字符时会遇到一些问题。

请参阅此主题最适合保留文件字节的向量类型是什么?有关“00000000”位(1 字节)问题的更多信息。

void writeFileBytes(const char* filename, std::vector<unsigned char>& fileBytes){
    std::ofstream file(filename, std::ios::out|std::ios::binary);
    file.write(fileBytes.size() ? (char*)&fileBytes[0] : 0, 
               std::streamsize(fileBytes.size()));
}

writeFileBytes("xz.bin", fileBytesOutput);
Run Code Online (Sandbox Code Playgroud)

有没有办法在本地使用“无符号字符”类型来写入文件?

这种担心真的有意义吗?


更新一:

有没有办法在本地使用“无符号字符”类型来写入文件?->是的!

遵循 krzaq 的指导方针!

void writeFileBytes(const char* filename, std::vector<unsigned char>& fileBytes){
    std::ofstream file(filename, std::ios::out|std::ios::binary);
    std::copy(fileBytes.cbegin(), fileBytes.cend(),
        std::ostream_iterator<unsigned char>(file));
}
Run Code Online (Sandbox Code Playgroud)

更新二:

这种担心真的有意义吗?->在某些方面,是的!

正如我在下面评论...

“...'unsigned char' 似乎具有'更高级别的兼容性'(包括 '00000000' 位)。当我们尝试将这 8 位('00000000' 位)转换为 'char' 时,我们没有与 ' 不同的值unsigned char'。使用 'unsigned char' 我们有一个无效/无法识别的 'char' 值,但我们有......”

请参阅此主题最适合保留文件字节的向量类型是什么?想要查询更多的信息!

krz*_*zaq 5

没关系,char*可以用来访问任何类型的数据,它会正常工作。但是如果你不想使用显式转换,可以使用std::copyand std::ostreambuf_iterator

copy(fileBytes.cbegin(), fileBytes.cend(),
     ostreambuf_iterator<char>(file));
Run Code Online (Sandbox Code Playgroud)

或者,您可以致电

copy(fileBytes.cbegin(), fileBytes.cend(),
     ostream_iterator<char>(file));
Run Code Online (Sandbox Code Playgroud)

但它会做同样的事情,只是可能更慢。

顺便说一句:您不能将空指针传递给write,那是 UB。