C++ 如何以STL方式将文件中一定数量的字符复制到向量中?

C++ 如何以STL方式将文件中一定数量的字符复制到向量中?,c++,stl,C++,Stl,如果我想将文件内容复制到向量,我可以这样做: std::ifstream file("path_to_file"); std::vector<char> buffer(std::istream_iterator<char>(file), std::istream_iterator<char>()); std::ifstream文件(“路径到文件”); std::vector buffer(std::istr

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

std::ifstream file("path_to_file");
std::vector<char> buffer(std::istream_iterator<char>(file), 
                         std::istream_iterator<char>());
std::ifstream文件(“路径到文件”);
std::vector buffer(std::istream_迭代器(文件),
std::istreamu迭代器();
我的问题是,如果我只想复制第一个
n
字符,我该怎么做

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

char*buffer=new char[n];
char *buffer = new char[n];
file.read(buffer,n);
std::vector<char> myVector
for (int i=0;i<n;i++) myVector.push_back(buffer[i]);
delete [] buffer;

// myVector now holds the first n bytes of file.
文件读取(缓冲区,n); 向量myVector 对于(int i=0;i,正如所指出的,这将需要,由于疏忽,它不在当前的标准库中,但将在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; 
} 


但是,我不认为这是一个优于直接从文件读取的优势。

< P>“STL方式”是使用<代码> CopyOnn>代码>,这是在STL而不是C++标准。

< P>正如亚力山大指出的,最快的方式是

std::vector<char> buffer(n);
file.read(&buffer[0], n);
std::向量缓冲区(n);
文件读取(&缓冲区[0],n);

在C++0x中,可以使用
buffer.data()
而不是
&buffer[0]
;如果
n==0
,由于@sbi,我忘记了
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>()) );
文件中的
streambuf
有一个函数
snextc
,该函数在隐式
参数绑定后返回下一个字符,将其限定为生成器函数

generate_n( back_inserter( buffer ), 42,
            tr1::bind( tr1::mem_fn( &streambuf::snextc ), file.rdbuf() ) );

对于
vector
,只需直接阅读。这对
deque
或任何东西都有好处。

不漂亮,但可以使用replace\u copy\u如果,使用谓词检查是否复制了n个字符!!一个较短的字符只需执行
std::vector myVector(buffer,n);
应该是
std::vector myVector(buffer,buffer+n);
(跳过FrLoad)直接读入一个(足够大的)向量有什么不对?听起来合理,但如果移植性是一个问题,那么不可取。还有,这是不是在C++ X0中添加到标准?是的,它是在C++ 0x中。如果移植性是一个问题,那么不要做STL方式,而是用C++标准方式;在这种情况下,这可能意味着只需在您自己的命名空间中实现copy\n,或者从其他地方获取实现。Sbi的实现对于流迭代器是不正确的,它在增量和初始化时都从流中读取。我修复了它。@Don:谢谢。这就是为什么即使是这样简单的算法也应该我会在性病实验室——即使是最简单的细菌,也很容易让细微的细菌溜进实验室。