【问题标题】:std::istreambuf_iterator<char> initializes with no arguments?std::istreambuf_iterator<char> 没有参数初始化?
【发布时间】:2014-03-30 01:41:19
【问题描述】:

代码如下:

#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>

std::vector<unsigned char> bytes;
{
    std::ifstream in(name, std::ios_base::binary);
    bytes.assign(std::istreambuf_iterator<char>(in >> std::noskipws),
                 std::istreambuf_iterator<char>());
}

根据参考资料,vector.assign 函数接受两个参数,firstlast,并将介于两者之间的任何内容放入向量中。 istreambuf_iterator 函数采用这种形式:

istreambuf_iterator( std::basic_istream<CharT,Traits>& is );    
istreambuf_iterator( std::basic_streambuf<CharT,Traits>* s );

这些都好理解,但是在上面的sn-p中,第二个迭代器初始化器不带参数,是什么意思?

还要注意bytes的类型是unsigned char,而迭代器的类型是char,这不是不匹配吗?

【问题讨论】:

  • 默认构造函数结束流迭代器。见here
  • 还有一个从charunsigned char的隐式转换。

标签: c++ io binaryfiles


【解决方案1】:

第二个迭代器初始化器不带参数,这是什么意思?

这意味着它被初始化为流结束迭代器。

还要注意bytes的类型是unsigned int,而迭代器的类型是char,这不是不匹配吗?

你的意思是unsigned char 对吗? (这就是它在您的代码中所说的。)

这很好,因为unsigned char 可以从char 构造和分配。采用迭代器范围的模板化函数通常不需要类型完全匹配。 (具体要求见标准§23.2.3中的表100。)

【讨论】:

  • 在这种情况下,如果我只想读取两个字节,我应该给 istreambuf_iterator 什么参数?
  • @qed 我不相信有一个很好的方法可以做到这一点。写个循环就好了。
猜你喜欢
  • 2020-07-30
  • 2019-06-24
  • 2017-08-04
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多