如何从std :: ifstream将文件读入unsigned char数组?

myW*_*SON 4 c++ boost std boost-iostreams

所以我做的事情很像:

    std::ifstream stream;
    int buff_length = 8192;
    boost::shared_array<char> buffer( new char[buff_length]);
    stream.open( path.string().c_str(), std::ios_base::binary);
    while (stream)
    {
            stream.read(buffer.get(), buff_length);
            //boost::asio::write(*socket, boost::asio::buffer(buffer.get(), stream.gcount()));
    }
    stream.close();
Run Code Online (Sandbox Code Playgroud)

我想知道怎么读入unsigned charbuffer(boost::shared_array<unsigned char> buffer( new unsigned char[buff_length]);)

Max*_*kin 11

最简单的形式:

std::vector<unsigned char> vec(
      std::istreambuf_iterator<char>(std::cin)
    , std::istreambuf_iterator<char>()
    );
Run Code Online (Sandbox Code Playgroud)

替换std::cin为您的实际流.

上面的内存分配可能不止一个(对于大于几个字节的文件)因为std::istreambuf_iterator<>是输入迭代器,而不是随机访问或前向迭代器,所以文件的长度无法通过减去迭代器end - begin或调用std::distance(begin, end).它可以减少到一个存储器分配如果创建第一空载体中,然后std::vector<>::reserve()被调用来为文件长度分配内存和最后范围刀片被称为vec.insert(vec.end(), beg, end)与beg和end为std::istreambuf_iterator<>如上读取整个文件.

如果文件大小超过几千字节,则将其映射到进程内存以避免将内存从内核复制到用户空间可能是最有效的.

使用的原因std::istreambuf_iterator<char>是因为实现使用std::char_traits<>通常只有char和的特化wchar_t.无论如何,C和C++标准要求所有char类型都具有相同的二进制布局而没有填充位,因此char,(unsigned char和signed char所有不同类型,不同signed int且int是相同类型)之间的转换保留了位模式,因此是安全的.

[basic.fundamental/1]

简单char,signed char并且unsigned char是三种不同的类型,统称为窄字符类型.A char,a signed char和a unsigned char占用相同的存储量并具有相同的对齐要求; 也就是说,它们具有相同的对象表示...对于窄字符类型,对象表示的所有位都参与值表示...对于无符号窄字符类型,值表示的每个可能位模式表示不同的数字.这些要求不适用于其他类型.在任何特定实现中,普通char对象可以采用与a signed char或a相同的值unsigned char; 哪一个是实现定义的.为每个值i类型的unsigned char取值范围为0到255以下,存在一个值j类型的char,使得来自一个整体转换的结果i来char是j,和积分变换的从结果j到unsigned char是i.