将固定数量的字节复制到 std::d eque <char>中

Copy a fixed number of bytes into an std::deque<char>

本文关键字:eque lt gt char std 复制 字节      更新时间:2023-10-16

我正在创建一个类来缓冲从std::cin读取的一些二进制数据;我需要一些有限的能够通过流回溯。更详细地说,当我从流中read n字节时,我希望能够倒回到 n流中的字节。

目前,我通过附加单个字符来附加到缓冲区到std::deque,但我希望有更好的复制方法数据块从std::istreamstd::deque

基本上有没有办法改进(删除?下面的load功能?

目前我有:

#include<algorithm>
#include<deque>
class BufferedStdIn{
public:
BufferedStdIn(): m_buffer(), m_cursor(0){
}
// copy data out from my internal buffer to the client's array
// format dictated by external interface requirement
void read(char* dest, size_t n){
    load(n)
    std::copy( m_buffer.begin(), m_buffer.begin()+n, dest );
    m_cursor+=n;
}
// Go backwards in the stream; return the number of bytes moved.
// @retval < input arg n indicates that we can't rewind as far as asked for
size_t rewind(size_t n){
    int final_pos=m_cursor-n;
    if( final_pos < 0 ){
        // can't go as far as the client wants, just go back to start of my buffer
        size_t moved=m_cursor;
        m_cursor=0;
        return moved;
    }
    else{ // can do what client wants
        m_cursor=final_pos;
        return n;
    }
}
void load(n){
    m_buffer.erase( m_buffer.begin(), m_buffer.begin()+m_cursor);
    m_cursor=0;
    while( m_buffer.size()<n){
        char c;
        std::cin.get(c);
        m_buffer.push_back(c);
    }
}
// SNIP: other functions that let clients look at m_buffer
std::deque<char> m_buffer;
size_t m_cursor;

}

也许效率不高,但更短:

void load(size_t n)
{
    m_buffer.erase( m_buffer.begin(), m_buffer.begin()+m_cursor);
    m_cursor=0;
    if(m_buffer.size() < n)
        std::copy_n(std::istream_iterator<char>(std::cin), n - m_buffer.size(), std::back_inserter(m_buffer));
}