[英]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)
使用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
是相同类型)之间的转换保留位模式因此是安全的。
Plain
char
,signed char
和unsigned char
是三种不同的类型,统称为窄字符类型 。char
,signed char
和unsigned char
占用相同的存储空间并具有相同的对齐要求; 也就是说,它们具有相同的对象表示...对于窄字符类型,对象表示的所有位都参与值表示...对于无符号窄字符类型,值表示的每个可能位模式表示不同的数字。 这些要求不适用于其他类型。 在任何特定实现中,普通char
对象可以采用与signed char
或unsigned char
相同的值; 哪一个是实现定义的。 对于0到255(包括0和255)范围内的unsigned char
类型的每个值i
,存在char
类型的值j
,使得从i
到char
的整数转换的结果是j
,以及从j
到unsigned char
的积分转换的结果unsigned char
是i
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.