以下のようなことがしたいのですが、なるべく余計なコピーを行うことなしに標準的な手段で実現することは可能でしょうか。
buf = 可変長バッファ、is = istreamとして、
1) 任意のバイト数分のデータをisから取ってきてbufに追加。
2) bufの頭から「ある処理」を行い、処理を完了したバイト数分bufから捨てる。なお、「ある処理」は使用するライブラリの都合上(const)char*が必須。

いまのところbufにstringを使用していて、(2)は以下:
const char* p = buf.data();
...
buf.erase(0, processed_size);
のように実現できそうなのですが、(1)がうまくいきません。
今はこう(↓)なっていますが、激しく気持ち悪いです。
char *add = alloca(n + 1); // char add[n + 1]; だとg++ -ansi -pedanticで怒られた
memset(add, '\0', n + 1);
is.read(add, n); // 実際に読み取ったバイト数もわからない。処理前後の位置を調べるしかない?
buf += add;

最初はnバイト分bufを広げてdata()の後ろに追記しようとしたのですが、返す型がconstなのでボツ。(書き換えると何が起きるかわからんで、と書いてあるし)
次にostringstreamを使おうとしたのですが、str()が返すのはコピーのようなので意味なし。

今のところ考えているのは、(1)を
a) 素直に1バイトずつループで追記。
b) 可変長バッファクラスを独自実装。
のどちらかで実現、と思っているのですが、C++は初心者なので、アプローチからして何か間違えているような気がしてならないです……。