当我使用此代码

std::string filename = "tmp.bin";
std::ifstream fileStream;
std::vector<unsigned char> fileBuffer;

fileStream = std::ifstream(filename.c_str(), std::ios::binary | std::ios::ate);
fileBuffer.reserve(fileStream.tellg());
fileStream.seekg(0, std::ios::beg);
fileBuffer.insert(fileBuffer.begin(), std::istream_iterator<BYTE>(fileStream), std::istream_iterator<BYTE>());


我的二进制文件中的所有原始空格都将被跳过-> fileBuffer不包含空格,但需要所有令牌用于Base64编码。

怎么了

最佳答案

您需要使用std::istreambuf_iterator<char>istream_iterator使用operator>>提取数据,对于charunsigned char默认情况下将跳过空格。

附带说明:C ++中的文件缓冲区是根据C标准定义的,在有关查找二进制文件末尾的注释中有以下说法:


  与fseek(file, 0, SEEK_END)一样,将文件位置指示符设置为文件末尾对于二进制流(由于可能存在尾随空字符)或具有状态相关编码且不能确保以初始结尾的任何流都具有未定义的行为转移状态。


无论如何,它可能都可以正常工作,但是除非重新分配是一个严重的问题,否则您应该只一次性处理该文件

std::ifstream fileStream("tmp.bin", std::ios::binary);
std::vector<char> fileBuffer{
  std::istreambuf_iterator<char>(fileStream),
  std::istreambuf_iterator<char>()
};


较旧的C ++将需要避免繁琐的解析

std::vector<char> fileBuffer(
  (std::istreambuf_iterator<char>(fileStream)),
  std::istreambuf_iterator<char>()
);


如果您的库中有char_traitsunsigned char,尽管它不是可移植的,但您也可以使用std::basic_ifstream<unsigned char>,您始终可以根据需要随时转换为unsigned char

10-08 08:28