Cstring中GetBuffer()方法的主要作用

GetBuffer()主要作用是将字符串的缓冲区长度锁定
 
CString::GetBuffer有两个重载版本:
(1) LPTSTR  GetBuffer( );
(2) LPTSTR   GetBuffer( int   nMinBufferLength)

在第二个版本中,
当设定的长度小于原字符串长度时,nMinBufLength nOldLen, 该参数会被忽略,不分配内存,指向原CString;
当设定的长度大于原字符串本身的长 度时就要重新分配(reallocate)一块比较大的空间出来。

而调用第一个版本时,应 如通过传入0来调用第二个版本一样。

这个函数是为一个CString对象重新获取其内部字符缓冲区指针,返回的LPTSTR为非const的,从而允许直接修改CString中的内容。
如果nMinBufLength(最小占用长度) 比当前buffer长度大,那么就调用GetBuffer函数去释放当前的Buffer,用一个被请求的大小去覆盖这个buffer并且重新设定计数器为0,如果在这之前你在这个buffer中调用了LockBuffer,那么你将失去你当前锁定的buffer。

如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。

如果仅仅是读出CString中的内容,那么只需要用GetBuffer(0)即可。如果后面对CString还有其他操作,那么立刻ReleaseBuffer。



GetBuffer(int size)是用来返回一个你所指定大小可写内存的成员方法。它和被重载的操作符LPCTSTR还是有点本质区别的,LPCTSTR是直接返回一个只读内存的指针,而GetBuffer则是返回一个可以供调用者写入的内存,并且,你可以给定大小。下面是个简单的,但也是非常典型的例子:

int readFile(CString& str, const CString& strPathName)

{

FILE* fp = fopen(strPathName, "r"); // 打开文件

fseek(fp, 0, SEEK_END);

int nLen = ftell(fp); // 获得文件长度

fseek(fp, 0, SEEK_SET); // 重置读指针

char* psz = str.GetBuffer(nLen);

fread(psz, sizeof(char), nLen, fp); //读文件内容

str.ReleaseBuffer(); //千万不能缺少

fclose(fp);

}

上面的函数是GetBuffer函数最典型的用法了,其实它就相当于申请一块nLen大小的内存,只不过,这块内存是被引用在CString对象的内部而已,这是非常有效的一种用法,如果不直接用GetBuffer函数来申请的话,那么你必须用new操作符(或者malloc()函数)在CString的外部申请,然后再将申请的内存拷贝到CString对象中,显然这是一个非常冗余的操作,会使你函数的效率大大下降。

ReleaseBuffer函数是用来告诉CString对象,你的GetBuffer所引用的内存已经使用完毕,现在必须对它进行封口,否则CString将不会知道它现在所包含的字符串的长度,所以在使用完GetBuffer之后,必须立即调用ReleaseBuffer函数重置CString的内部属性,其实也就是头部信息。


  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值