如何将一定数量的字符从文件复制到STL-way的向量?

Bjö*_*lex 6 c++ stl

如果我想将文件的内容复制到矢量,我可以这样做:

std::ifstream file("path_to_file");
std::vector<char> buffer(std::istream_iterator<char>(file), 
                         std::istream_iterator<char>());
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我只想复制第一个n字符,我该怎么做?

编辑我可以编写自己的版本copy,但有没有办法只使用现有的组件?

ava*_*kar 8

正如亚历山大指出的那样,最快的方式就是

std::vector<char> buffer(n);
file.read(&buffer[0], n);
Run Code Online (Sandbox Code Playgroud)

在C++ 0x中,您可以使用buffer.data()而不是&buffer[0]; 如果后者具有未定义的行为n == 0.


sbi*_*sbi 6

正如史蒂夫所指出的那样,这需要copy_n(),由于疏忽,不在当前的标准库中,而是在C++ 1x中.你可以轻松地自己实现一个,这是我认为正确的一个:

template<class InIt, class OutIt> 
OutIt copy_n(InIt src, OutIt dest, size_t n) 
{
  if (!n) return dest;
  *dest = *src;
  while (--n)
    *++dest = *++src;
  return ++dest; 
} 
Run Code Online (Sandbox Code Playgroud)

请注意,std::copy_n()假设输入迭代器能够传递n对象.从文件中读取时,这可能会有问题.


没有std::copy_n(),你可以使用std::generate_n.

template< typename InIt >
struct input_generator {
  typedef std::iterator_traits<InIt>::value_type value_type;

  input_generator(InIt begin, InIt end) begin_(begin), end_(end) {}

  value_type operator()()
  {
    assert(it_ != end);
    return *it_++;
  }

  Init begin_;
  Init end_;
};


std::vector<char> buffer;
buffer.reserve(42);

std::generate_n( std::back_inserter(buffer)
               , 42
               , input_generator(std::istream_iterator<char>(file))
               , input_generator(std::istream_iterator<char>()) );
Run Code Online (Sandbox Code Playgroud)

但是,我并不认为这比直接从文件中读取更有优势,正如avakar所示.