博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CString.Buffer()的作用
阅读量:2051 次
发布时间:2019-04-28

本文共 2163 字,大约阅读时间需要 7 分钟。

转载自:

摘自:
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中 我們之後可以對其操作
      }

 

摘自:&

如果你需要修改   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 ,并获得一个只读内存的指针,存入操作会失败,并报告存取错误。

 

你可能感兴趣的文章
Leetcode C++《热题 Hot 100-47》236.二叉树的最近公共祖先
查看>>
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
[Kick Start 2020] Round A 1.Allocation
查看>>
[Kick Start 2020] Round A 2.Plates
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>
阿里云《云原生》公开课笔记 第二章 容器基本概念
查看>>
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>
阿里云《云原生》公开课笔记 第六章 应用编排与管理:Deployment
查看>>
阿里云《云原生》公开课笔记 第七章 应用编排与管理:Job和DaemonSet
查看>>
阿里云《云原生》公开课笔记 第八章 应用配置管理
查看>>
阿里云《云原生》公开课笔记 第九章 应用存储和持久化数据卷:核心知识
查看>>
linux系统 阿里云源
查看>>
国内外helm源记录
查看>>