>>33のcapture_stringをパクればいいんでね?

class CaptureString {
public:
 typedef char value_type;
private:
 CString *target;
 size_t size;
 value_type *buffer;
public:
 CaptureString(CString *target_, size_t size_ = DEFAULT_SIZE)
  : target(target_), size(size_), buffer(NULL) {
 }
 ~CaptureString() {
  if (buffer != NULL) {
   target->ReleaseBuffer();
  }
 }
 operator value_type *() {
  if (buffer == NULL) {
   buffer = target->GetBuffer(size);
  }
  return buffer;
 }
};

// 使用例
CString str;
fgets(stdin, CaptureString(&str, BUF_SIZE), BUF_SIZE);