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

摘自:http://bbs.csdn.net/topics/310247836
GetBuffer()主要作用是将字符串的缓冲区长度锁定

CString::GetBuffer有两个重载版本:

  • LPTSTR GetBuffer( );
  • LPTSTR GetBuffer(int nMinBufferLength)
    在第二个版本中,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,
    该参数会被忽略,不分配内存,指向原CString;当设定的长度大于原字符串本身的长
    度时就要重新分配(reallocate)一块比较大的空间出来。而调用第一个版本时,应
    如通过传入0来调用第二个版本一样。

摘自:http://www.programfan.com/blog/article.asp?id=40755
首先举个例子。

  CString   s(   "abcd"   );   
  int   len=s.GetLength();   
  LPTSTR   p   =   s.GetBuffer(   5   );   
  strcpy(   p,   "Hello"   );   
  • 如果你需要修改 CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。
  • 如果仅仅是读出CString中的内容,那么只需要用GetBuffer(0)即可。如果后面对CString还有其他操作,那么立刻ReleaseBuffer。

其他:

GetBuffer() 他会create出所指定大小的空间出來,这个空间是可以让我們修改的。很多時候 有的 API 会要一个(char*)的指针作为输出。如果我们就因為这个去产生一个(char*)的buffer 給他,等到资料取出来之后,便无法使用CString 的种种方便功能。
因此比较好的做法,便是用GetBuffer()來产生一个buffer空间給他,等到取出來之后,我们便可以直接使用CString來对他操作
GetBuffer() 使用完后,最好是调用一下ReleaseBuffer()做为結束。

  CFile file;
  // FILE_NAME 为事先定义到的档案文件名
  if(file.Open(FILE_NAME,CFile::modeRead))
  {
    CString szContent;
    int nFileLength = file.GetLength();
    file.Read(szContent.GetBuffer(nFileLength),nFileLength);
    szContent.ReleaseBuffer();
  // 取得档案內容放在szContent中 我们之后可以对其操作
  }

摘自:http://wtfang.blog.163.com/blog/static/31594808201141111413217/?COLLCC=4192787263&

如果你需要修改CString 中的内容,它有一个特殊的方法可以使用,那就是 GetBuffer,它的作用是返回一个可写的缓冲指针。 如果你打算修改字符或者截短字符串,你完全可以这样做:

  CString   s(_T("File.ext"));   
  LPTSTR   p   =   s.GetBuffer();   
  LPTSTR   dot   =   strchr(p,  '' . '');  
  if(p   !=   NULL)   
  *p   =   _T(''\0'');   
  s.ReleaseBuffer();   

这是 GetBuffer 的第一种用法,也是最简单的一种,不用给它传递参数,它使用默认值 0,意思是:“给我这个字符串的指针,我保证不加长它”。当你调用 ReleaseBuffer 时,字符串的实际长度会被重新计算,然后存入 CString 对象中。
  必须强调一点,在 GetBuffer 和 ReleaseBuffer 之间这个范围,一定不能使用你要操作的这个缓冲的 CString 对象的任何方法。因为 ReleaseBuffer 被调用之前,该 CString 对象的完整性得不到保障。研究以下代码:

  CString   s(...);   
    
  LPTSTR   p   =   s.GetBuffer();   
    
  //...   这个指针 p 发生了很多事情   
    
  int   n   =   s.GetLength();     // 有可能给出错误的答案!!!   
    
  s.TrimRight();                       // 不能保证能正常工作!!!!   
    
  s.ReleaseBuffer();               //  现在应该OK   
    
  int   m   =   s.GetLength();   // 这个结果可以保证是正确的。   
    
  s.TrimRight();                      //   将正常工作。

假设你想增加字符串的长度,你首先要知道这个字符串可能会有多长,好比是声明字符串数组的时候用: char buffer[1024];
表示 1024 个字符空间足以让你做任何想做得事情。

      在   CString   中与之意义相等的表示法:   
      LPTSTR   p   =   s.GetBuffer(1024);   

调用这个函数后,你不仅获得了字符串缓冲区的指针,而且同时还获得了长度至少为 1024 个字符的空间(注意,我说的是“字符”,而不是“字节”,因为 CString 是以隐含方式感知 Unicode 的)。
  同时,还应该注意的是,如果你有一个常量串指针,这个串本身的值被存储在只读内存中,如果试图存储它,即使你已经调用了 GetBuffer ,并获得一个只读内存的指针,存入操作会失败,并报告存取错误。

转载自:https://www.cnblogs.com/thefirstfeeling/p/5783303.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值