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