二进制文件流到字节std :: vector跳过空格

时间:2016-03-31 06:49:46

标签: c++ file c++11 visual-studio-2012 vector

当我使用此代码时

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

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

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

您需要使用std::istreambuf_iterator<char>istream_iterator使用operator>>来提取数据,charunsigned char默认会跳过空格。

附注:C ++中的filebuf是根据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,具体取决于您的身份需要。