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. 【数据库-Azure SQL Database】如何创建事务复制将本地数据同步到 SQL Azure

    Azure SQL DB 可以被配置成为 SQL Server 事务复制的一个订阅者( subscriber ). 主要应用场景有两种: 将您的数据迁移到 Azure SQL DB, 并且没有宕机时间 ...

  2. 在前台引用JSON对象

    <script type="text/javascript" src="js/jquery-1.11.0.min.js"></script&g ...

  3. codevs 2915 期末考试

    时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold 题目描述 Description 期末考试要来了,某同学正在努力复习. 他要复习N个知识点,每个知识点需要一定的知识 ...

  4. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [arg1, arg0, param1, param2]

    2018-06-27 16:43:45.552  INFO 16932 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : ...

  5. 解决android studio设置版本号

    获取版本号代码 /** * 获取版本号 * @return 当前应用的版本号 */ public static String getVersion(Context context) { try { P ...

  6. 在Phonegap下实现oAuth认证

    原文:http://www.kuqin.com/mobile/20120719/322873.html 前段时间做过两次关于Phonegap的现场交流会议分享.基本上把Phonegap的一些特性和大家 ...

  7. Bootstrap历练实例:超小的按钮

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  8. ASP.NET 开发人员不必担心 Node 的五大理由

    哦别误会……我真的很喜欢 Node,而且我觉得它提出的概念和模式将在很长一段时间内,对服务端 Web 编程产生深远的影响.即使随着时间的推移 Node 过气了,我们肯定可以从下一个牛逼玩意身上或多或少 ...

  9. 对于Nginx+PHP实现大文件上传时候需要修改的参数

    post_max_size表示POST表单提交的最大大小upload_max_filesize 表示文件上传的最大大小. 通常post_max_size设置的值必须必upload_max_filesi ...

  10. dubbo---------timeout与retires

    相信很多人都见过这张图,这张图说明了提供者与消费者之间的关系,下面就介绍一下这个图是什么意思. 1.角色解释: Provider: 暴露服务的服务提供者. Consumer: 调用远程服务的服务消费者 ...