2012-04-26 323 views
4

所以normaly我做的东西,如:如何从std :: ifstream中将文件读入unsigned char数组?

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

+2

其中'reinterpret_cast <>'实际上是正确的方法。 – Chad 2012-04-26 14:29:54

+0

此外,我更喜欢shared_ptr >为shared_array – 2012-04-26 15:00:41

回答

10

在最简单的形式:

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]

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

+3

对于最后一个段落 – sehe 2013-04-03 18:26:53

+0

标准不要求'char c = -1;无符号字符u = c;'结果'c'和'u'具有相同的位模式。理论上,有符号的字符可以使用1的补码或符号的大小。 – 2018-02-09 01:53:39

+0

* signed char的非负值*必须与相应的unsigned char具有相同的表示形式。但是在例子中,'char c = -1;'具有位模式11111110,而'unsigned char u = c;'具有位模式11111111.这主要是学术性的,因为我不知道任何C++实现不使用2的补码 – 2018-02-09 02:07:28

相关问题