[英]Copy a fixed number of bytes into an std::deque<char>
我正在制作一個類,用於緩沖從std::cin
讀取的一些二進制數據; 我需要一些有限的能力來回溯流。 更詳細地講,當我從流中read
n
個字節時,我希望能夠倒回流中的n
個字節。
當前,我通過將單個字符追加到std::deque
來追加到緩沖區,但是我希望有更好的方法將數據塊從std::istream
復制到std::deque
。
基本上,有什么方法可以改善(刪除?)下面的load
函數中的while循環嗎?
目前我有:
#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));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.