当我使用此代码时
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编码。
这里有什么问题?
答案 0 :(得分:1)
您需要使用std::istreambuf_iterator<char>
,istream_iterator
使用operator>>
来提取数据,char
和unsigned 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_traits
为unsigned char
,您也可以使用std::basic_ifstream<unsigned char>
,虽然这不是便携式的,但您可以随时转换为unsigned char
,具体取决于您的身份需要。