所以通常我会做这样的事情:
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>()
);
Replace std::cin
与您的实际流。
上面的代码可能会执行多次内存分配(对于大于几个字节的文件),因为std::istreambuf_iterator<>
是一个输入迭代器,而不是随机访问或前向迭代器,因此文件的长度不能通过减去迭代器来测量,例如end - begin
或致电std::distance(begin, end)
。如果向量首先创建为空,则可以减少到一次内存分配,然后std::vector<>::reserve()
调用为文件长度分配内存,最后调用范围插入vec.insert(vec.end(), beg, end)
with beg
and end
being std::istreambuf_iterator<>
如上所述读取整个文件。
如果文件大小超过几千字节,则将其映射到进程内存以避免将内存从内核复制到用户空间可能是最有效的。
原因std::istreambuf_iterator<char>
使用是因为实现使用std::char_traits<>
通常只专门针对char
and wchar_t
。无论如何,C 和 C++ 标准要求所有char
类型具有相同的二进制布局,没有填充位,因此之间的转换char
, unsigned char
and signed char
(它们都是不同的类型,不像signed int
and int
相同类型)保留位模式,因此是安全的。
[基本.根本/1]
Plain char
, signed char
, and unsigned char
是三种不同的类型,统称为窄字符类型. A char
, a signed char
, 和unsigned char
占用相同的存储量,具有相同的对齐要求;也就是说,它们具有相同的对象表示...对于窄字符类型,对象表示的所有位都参与值表示...对于无符号窄字符类型,值表示的每个可能的位模式代表一个不同的数字。这些要求不适用于其他类型。在任何特定的实现中,一个简单的char
对象可以采用与 a 相同的值signed char
or an unsigned char
;哪一个是实现定义的。对于每个值i
类型的unsigned char
在 0 到 255(含)范围内,存在一个值j
类型的char
这样积分转换的结果i
to char
is j
,以及积分转换的结果j
to unsigned char
is i
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)