【问题标题】:Binary filestream to byte std::vector skips spaces二进制文件流到字节 std::vector 跳过空格
【发布时间】:2016-03-31 06:49:46
【问题描述】:

当我使用这段代码时

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 编码的所有标记。

这里有什么问题?

【问题讨论】:

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


    【解决方案1】:

    你需要使用std::istreambuf_iterator&lt;char&gt;istream_iterator使用operator&gt;&gt;提取数据,对于charunsigned char默认会跳过空格。

    旁注:C++ 中的 filebufs 是根据 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&lt;unsigned char&gt;,尽管这不是可移植的,您可以随时根据需要转换为unsigned char

    【讨论】:

    • 发生了一些奇怪的事情 -> 如果我这样做,我将无法访问 fileBuffer!也许它非常简单,但 Visual Studio 显示错误“错误:表达式必须具有类类型”! (包括迭代器)WTF???
    • @leon22 你能在某处发布一个简短的例子吗?
    • @leon22 哎呀,最令人头疼的解析,现在已修复,假设您可以使用 c++11。
    • 我用的是VS2012 (C++-11),所以这段代码编译不出来!抱歉,在这种特殊情况下,C++-11 和 C++-14 之间似乎存在差异。你能再更新一次吗?谢谢
    • @leon22 我添加了一个非 C++11 版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    相关资源
    最近更新 更多