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

首先举个例子。

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()做為結束

雖然小弟的網誌之前已經有很多GetBuffer()的使用了 不過還是附個範例
      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 ,并获得一个只读内存的指针,存入操作会失败,并报告存取错误。

Cstring中GetBuffer()方法的主要作用的更多相关文章

  1. POI中setDefaultColumnWidth方法不起作用的原因

    sheet.setDefaultRowHeight((short) (2 * 256)); //设置默认行高,表示2个字符的高度 sheet.setDefaultColumnWidth(17);   ...

  2. HashMap中 工具方法tableSizeFor的作用

    [转] https://blog.csdn.net/fan2012huan/article/details/51097331 首先看下该方法的定义以及被使用的地方 static final int t ...

  3. Jquery中addClass方法不起作用的解决方案

    selected类是要在点击后添加上去的新样式,在点击后,发现没有变化,打开开发者工具,发现selected类已经添加成功了. 在这里没有显示成功的主要原因是后添加的样式表优先级更低,我暂时不清楚具体 ...

  4. java中native方法的使用

    在非常多情况下,java须要调用其它语言的代码,比方c的代码.那么这个时候java中native方法就发挥作用了.以下就介绍native方法的使用. 一.JNI使用流程 a.编写带有native声明的 ...

  5. Python--day37--多进程中的方法join()

    1,多进程中的方法join()的作用: 感知一个子进程的结束,将异步的程序改为同步 #join() import time from multiprocessing import Process de ...

  6. CString的GetBuffer用法,GetBuffer本质,GetBuffer常见问题解决方法

    一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); Return V ...

  7. MFC中的CString类使用方法指南

    MFC中的CString类使用方法指南 原文出处:codeproject:CString Management [禾路:这是一篇比较老的资料了,但是对于MFC的程序设计很有帮助.我们在MFC中使用字符 ...

  8. Android中scrollview的scrollto方法不起作用的办法

    有时候,我们在onCreate函数中调用ScrollBy函数.ScrollTo函数,会出现无效果的情况 public class ShowTraffic extends Activity Scroll ...

  9. Linux中PATH环境变量的作用和使用方法

    关于PATH的作用:PATH说简单点就是一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径.比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls这个命令根 ...

随机推荐

  1. HDU 4276 The Ghost Blows Light (树形DP,变形)

    题意:给定一棵n个节点的树,起点是1,终点是n,每经过一条边需要消耗Ti天,每个点上有一定量的珠宝,要求必须在t天内到达终点才可以将珠宝带出去,问至多能带多少珠宝? 思路: 注意Ti可以为0,而且有可 ...

  2. 生鲜o2o配送应用系统,包括Android源码+SSH带后台管理系统

    前台功能划分    我的 登录            账户+密码 注册            订单管理 查看/删除(显示订单详情)                支付(提交订单)           ...

  3. Chrome浏览器扩展程序的本地备份

    由于众所周知的原因,有些朋友可能很难在线下载Chrome扩展程序.一种选择是可以让朋友把他成功安装的Chrome扩展程序导出成本地文件,然后让朋友发送给自己,在自己本地电脑上报这些本地文件直接拖到Ch ...

  4. haml scss转换编写html css的前期工作

    http://www.w3cplus.com/sassguide/install.html 先下载ruby $ gem sources $ gem sources --remove https://r ...

  5. SVN中的check out与export的区别

    http://blog.csdn.net/zndxlxm/article/details/7763116 check out跟check in对应,export跟import对应. check out ...

  6. maven项目jsp无法识别jstl的解决办法

    EL表达式无效是因为maven项目的jsp不识别jstl,只要在web-APP 标签中引入命名空间 xmlns="http://xmlns.jcp.org/xml/ns/javaee&quo ...

  7. python在d盘,robotframework引入seleniumlibrary报错

    在*** setting*** 中引入库   Library  SeleniumLibrary  报错 unknown seleniumlibrary library ,try to use quic ...

  8. js 监听页面url锚点变化 window.onpopstate

    window.onpopstate = function (event) { if (location.href.indexOf('#') == -1) { location.reload(); } ...

  9. XCode和Cocoa在开发中使用第三方dylib示例

    XCode和Cocoa在开发中使用第三方dylib示例 www.educity.cn   发布者:yukowang   来源:网络转载   发布日期:2014年06月13日      XCode和Co ...

  10. React初识整理(二)--生命周期的方法

    React生命周期主要有7中: 1. componentWillMount() :组件将要挂载时触发 ,只调用1次 2. componentDidMount() :组件挂载完成时触发,只调用1次 3. ...