copy_n或直到eof?

ron*_*nag 7 c++ algorithm file

我如何使用STL算法?

std::ifstream file(filename);

std::vector<unsigned char> buf;
for(auto file_it = std::istreambuf_iterator<char>(file); file_it != std::istreambuf_iterator<char>() && buf.size() < 2048; ++file_it)
    buf.push_back(*file_it);
Run Code Online (Sandbox Code Playgroud)

注意buf.size() < 2048.

例如,如果我执行以下操作会发生什么,并且文件小于2048字节?

std::copy_n(std::istreambuf_iterator<char>(file), 2048, std::back_inserter(buf));
Run Code Online (Sandbox Code Playgroud)

And*_*ron 1

正如文档所述, 将准确std::copy_n()复制项目。它将继续读取迭代器引用的序列末尾。不过,我不确定该标准是怎么说的。这可能是未定义的行为,但流可能会产生大量超出末尾的副本。当可用字节数少于时,这可能会导致大量垃圾。 nistreambuf_iterator<>eof()2048

无论如何,如果您想可靠地复制最多 n项目,您需要编写自己的函数:

template<typename I1, typename I2, typename size_type>
I copy_upto_n ( I1 begin, I1 end, size_type n, I2 out )
{
    for (size_type i=0; (i < n) && (begin != end); ++i)
    {
        *out++ = *begin++;
    }
    return out;
}
Run Code Online (Sandbox Code Playgroud)

有些人可能会使用std::iterator_traits<>而不是额外的模板参数来强制使用与迭代器相同的距离类型。