如何文件读入从性病:: ifstream的无符号的字符数组?(How to read a file

2019-06-23 23:50发布

所以normaly我做的东西,如:

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

Answer 1:

在最简单的形式:

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)begendstd::istreambuf_iterator<>如上读取整个文件。

如果文件大小是更然后几个千字节可能最有效的是将它映射到进程存储器,以避免从内核到用户空间复制存储器。

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

[basic.fundamental / 1]

平原charsigned charunsigned char有三种不同的类型,统称为窄字符类型 。 甲char ,一个signed char ,以及一个unsigned char占用存储相同量的并具有相同的对准要求。 也就是说,它们具有相同的对象表示...对于窄字符类型,对象表示的所有位参加值表示...有关无符号窄字符类型,则该值表示的每个可能的位模式代表一个不同的号码。 这些要求不持有其他类型。 在任何特定实现中,一个普通的char对象可以采取或者作为相同的值signed charunsigned char ; 其中之一是实现定义。 对于每一个值i类型的unsigned char在范围为0〜255以下,存在一个值j类型的char ,使得积分转换的结果从icharj ,以及从积分转换的结果junsigned chari



文章来源: How to read a file into unsigned char array from std::ifstream?