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

时间:2016-10-14 22:26:57

标签: c++ vector byte bit

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

有关“00000000”位(1字节)问题的详细信息,请参阅此主题What is the most suitable type of vector to keep the bytes of a file?

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);

有没有办法在本地使用“unsigned char”类型来写入文件?

这个问题真的有意义吗?

更新I:

有没有办法在本地使用“unsigned char”类型来写入文件? - &gt; 是<!/强>

遵循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));
}

更新II:

这个问题真的有意义吗? - &gt; 在某些方面,是的!

我在下面发表评论......

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

有关详细信息,请参阅此主题What is the most suitable type of vector to keep the bytes of a file?

1 个答案:

答案 0 :(得分:3)

无所谓,char*可用于访问任何类型的数据,并且它可以正常工作。但如果您不想使用显式广告,可以使用std::copystd::ostreambuf_iterator

copy(fileBytes.cbegin(), fileBytes.cend(),
     ostreambuf_iterator<char>(file));

或者,您可以致电

copy(fileBytes.cbegin(), fileBytes.cend(),
     ostream_iterator<char>(file));

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

顺便说一句:你无法将空指针传递给write,即UB。