GetBuffer()函數的使用

轉載地址: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 ,並獲得一個只讀內存的指針,存入操作會失敗,並報告存取錯誤。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章