程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++之GetBuffer函數詳解

C++之GetBuffer函數詳解

編輯:C++入門知識

        這個函數是為一個CString對象重新獲取其內部字符緩沖區的指針,返回的LPTSTR為非const的,從而允許直接修改CString中的內容! 如果nMinBufLength 比當前buffer大,那麼就調用ReleaseBuffer函數去釋放當前的Buffer,用一個被請求的大小去覆蓋這個buffer重新設定計數器為 0,如果在這之前你在這個buffer中調用了LockBuffer,那麼你將失去你當前鎖定的buffer
 
        如果你使用這個指向由GetBuffer所改變返回的字符串內容,那麼在你使用CString其他CString方法之前你必須調用ReleaseBuffer。在調用ReleaseBuffer函數之後GetBuffer中的內容將無效(也就是銷毀)
 
        當這個CString被銷毀的時候,這個buffer所占用的內存將被自動釋放
 
        注意: 如果你知道了這個字符串的長度,你不可以直接添加NULL字符了事,當你使用ReleaseBuffer的時候你必須指定最後的字符串長度,如果你僅僅添加了一個NULL字符結束符給這個字符串,你應該給ReleaseBuffer傳遞一個-1 當這個函數結束的時候_tcslen 將決定這個buffer的長度
  例子:
  // example for CString::GetBuffer
  CString s( "abcd" );//定義一個CString s並且初始化為abcd
  #ifdef _DEBUG
  afxDump << "CString s " << s << " ";
  #endif
  LPTSTR p = s.GetBuffer( 10 );//定義一個指針指向LPTSTR並接受GetBuffer所返回的地址
  lstrcpy( p, _T("Hello") ); // directly access CString buffer//使用Istrcpy將Hello]復制到該buffer中
  s.ReleaseBuffer( );//釋放buffer
  #ifdef _DEBUG
  afxDump << "CString s " << s << " ";這時候s="Hello";
  #endif
        這是一個非常容易被用錯的函數,主要可能是由於大家對它的功能不太了解。其實點破的話,也不是那麼深奧。
 
        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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved