关于源的操作,跪求高人指点

关于流的操作,跪求高人指点!
    我有这样一个问题,现在有这样一个函数,通过二进制数据流读特定的文件,然后把这个流传下去进一步操作,代码如下

void read(std::string filename)
{
    ……
    std::ifstream ifs(filename.c_str(), std::io::binary | std::io::in);
    read(std::istream& ifs);// 一个重载的read函数
    ……
}

    我现在要做的事情是拿到这个数据流,改变其中一部分的值,然后再往下传。也就是说,在上面两行代码之间做一个操作,把流的值改变了之后再调用那个重载的read函数。
    我尝试了把读文件的那个流改为
std::fstream
,打开方式为
std::io::binary | std::io::in | std::io::out
,这样的方式,这样会有个问题,就是在改变了流的值之后,在关闭流之后会改写源文件,当然改写了源文件的话,这个实现就是错误的。
    另外我尝试了获取stream的缓冲区,然后向缓冲中写值,但是没有写进去。代码如下

    std::streambuf* buf = ifs.rdbuf();
    buf->sputn(ptrData, nLength);

     其中,ptrData是一个数组的指针,nLength是拷贝的长度。但是尽管这样写了,流中的数据还是没有改变。
     现在想要请教大家的是如何改变流中的值,让我可以顺利的将改变后的流传递下去。

p.s.因为运行速率的问题,写临时文件的方案已经被否决,只能想办法在内存中改变流中的数值。或者大家还有什么其他比较好的方案,请指教!拜谢!
二进制数据流 内存 

------解决方案--------------------
把流都读入 string,然后操作 string.
------解决方案--------------------
1. 用string操作buffer(哪怕含\0)也是可以的. 只是你初始化的时候, 需要注意. 
char buf[256];
// string str(buf); // 非法, 因为buf含\0
string str(256, 0);
copy(buf, buf+256, str.begin, str.begin());


2. 可以使用Windows内存映射文件, 在映射的时候, 设置权限为"FILE_MAP_COPY".
这样修改都发生在内存中.
参考:
http://www.cnblogs.com/fangyukuan/archive/2010/09/09/1822216.html