将固定数量的字节复制到 std::d eque <char>中
Copy a fixed number of bytes into an std::deque<char>
我正在创建一个类来缓冲从std::cin
读取的一些二进制数据;我需要一些有限的能够通过流回溯。更详细地说,当我从流中read
n
字节时,我希望能够倒回到 n
流中的字节。
目前,我通过附加单个字符来附加到缓冲区到std::deque
,但我希望有更好的复制方法数据块从std::istream
到std::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));
}
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 在不同的内存位置同时写入 std::d eque 是否线程安全?
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 将对象从一个 std::d eque 移动到另一个的更好方法
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 为什么 std::d eque 不允许指定存储桶大小?
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么 std::queue 没有实现 insert() 而 std::d eque 实现了?
- 我可以在 c++11 中的 std::d eque 上使用 std::max_element() 吗?
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 是否可以将 std::d eque 的成员函数作为参数传递?
- 是否可以设置 stl::d eque 的内部数组的大小