从istream到ostream的快速控制复制

Ark*_*nez 15 c++ iterator iostream stream

我必须将几个字节从a复制istream到a ostream,我知道有两种方法可以执行此复制.

myostream << myistream.rdbuf();
Run Code Online (Sandbox Code Playgroud)

copy( istreambuf_iterator<char>(myistream),
      istreambuf_iterator<char>(),
      ostreambuf_iterator<char>(myostream)
);
Run Code Online (Sandbox Code Playgroud)

我发现该rdbuf版本至少是该版本的两倍copy.
我还没有找到复制方式,比方说100个字节,但由于要复制的大小可能会很大,我希望能够使用该rdbuf版本,如果可行的话.

如何将这些副本限制为给定的字节数?

Ben*_*ley 11

你能用0x吗?如果是这样,那么你可以使用copy_n:

copy_n( istreambuf_iterator<char>(myistream),
        100,
        ostreambuf_iterator<char>(myostream)
);
Run Code Online (Sandbox Code Playgroud)

编辑1:

我知道你可能正在寻找一个库解决方案,你可能已经自己想出来了.但是如果你没有想到这样的事情,这就是我要做的事情(如果我没有copy_n):

void stream_copy_n(std::istream & in, std::size_t count, std::ostream & out)
{
    const std::size_t buffer_size = 4096;
    char buffer[buffer_size];
    while(count > buffer_size)
    {
        in.read(buffer, buffer_size);
        out.write(buffer, buffer_size);
        count -= buffer_size;
    }

    in.read(buffer, count);
    out.write(buffer, count);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`copy_n` 变体复制了 `n` 项,但仅从输入流中删除了 `n-1` 项!http://coliru.stacked-crooked.com/a/5bf783061b54bc35 (2认同)