繁体   English   中英

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

[英]How to read a file into unsigned char array from std::ifstream?

所以我做的事情很像:

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

我想知道如何读取unsigned char缓冲区( boost::shared_array<unsigned char> buffer( new unsigned char[buff_length]);

最简单的形式:

std::vector<unsigned char> vec(
      std::istreambuf_iterator<char>(std::cin)
    , std::istreambuf_iterator<char>()
    );

用您的实际流替换std::cin

以上内容可能会进行多个内存分配(对于大于极少数字节的文件),因为std::istreambuf_iterator<>是一个输入迭代器,而不是随机访问或前向迭代器,所以文件的长度不能通过减去像end - begin或调用std::distance(begin, end)类的迭代器来测量。 如果向量首先创建为空,则可以减少为一个内存分配,然后调用std::vector<>::reserve()为文件长度分配内存,最后将范围插入称为vec.insert(vec.end(), beg, end)使用begend std::istreambuf_iterator<>如上所述读取整个文件。

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

使用std::istreambuf_iterator<char>的原因是因为实现使用std::char_traits<> ,它通常仅对charwchar_t 无论如何,C和C ++标准要求所有char类型具有相同的二进制布局而没有填充位,因此charunsigned charsigned char (它们都是不同类型,不像signed intint是相同类型)之间的转换保留位模式因此是安全的。

[basic.fundamental / 1]

Plain charsigned charunsigned char是三种不同的类型,统称为窄字符类型 charsigned charunsigned char占用相同的存储空间并具有相同的对齐要求; 也就是说,它们具有相同的对象表示...对于窄字符类型,对象表示的所有位都参与值表示...对于无符号窄字符类型,值表示的每个可能位模式表示不同的数字。 这些要求不适用于其他类型。 在任何特定实现中,普通char对象可以采用与signed charunsigned char相同的值; 哪一个是实现定义的。 对于0到255(包括0和255)范围内的unsigned char类型的每个值i ,存在char类型的值j ,使得从ichar的整数转换的结果是j ,以及从junsigned char的积分转换的结果unsigned chari

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM