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



  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
随笔 - 764 文章 - 3 评论 - 196 CString,string,char*之间的转换(转) 这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差。string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的;char*是从学习C语言开始就已经和我们形影不离的了,有许多API都是以char*作为参数输入的。所以熟练掌握三者之间的转换十分必要。 以下我用简单的图示指出三者之间的关系,并以标号对应转换的方法。 1 string to CString CString.format("%s",string.c_str()); 2 CString to string string str(CString.GetBuffer(str.GetLength())); 3 string to char * char *p=string.c_str(); 4 char * to string string str(char*); 5 CString to char * strcpy(char,CString,sizeof(char)); 6 char * to CString CString.format("%s",char*); CString的format方法是非常好用的。string的c_str()也是非常常用的,但要注意和char *转换时,要把char定义成为const char*,这样是最安全的。 以上函数UNICODE编码也没问题:unicode下照用,加个_T()宏就行了,像这样子_T("%s") 补充: CString 可能是 CStringW/CStringA,在与 string 转换时,如果是 CStringW,还涉及编码转换问题。下面以 CStringA 来说明。 1 string to CString CString.format("%s",string.c_str()); CStringA = string.c_str() 就可以了 2 CString to string string str(CString.GetBuffer(str.GetLength())); GetBuffer 有参数的话,可能导致内部的分配空间动作,要进行后续 ReleaseBuffer 操作。 string = CStringA string = CStringA.GetBuffer(); 3 string to char * char *p=string.c_str(); 4 char * to string string str(char*); 5 CString to char * strcpy(char *,CString,sizeof(char)); 按照 3 风格,这里应该 char * = CStringA; 或者 char *p = CStringA.GetBuffer(); 6 char * to CString CStringA = char * 就可以了
画图需求文档 a) 类图 b) 调用效果 c) 类图说明 1. BrushMainForm类 函数原型 actionPerformed(java.awt.event.ActionEvent e) 函数说明 菜单的事件监听,相应不同的菜单操作。 函数原型 findAccelerKey(java.lang.String text) 函数说明 根据指定的文本得到快捷键。 函数原型 canvasInit() 函数说明 画布的初始化函数函数原型 newFile() 函数说明 新建一个文件的方法。 函数原型 openFile() 函数说明 打开一个文件。 函数原型 saveFile() 函数说明 保存文件。 函数原型 saveAs() 函数说明 另存为文件。 2. ColorPalette类 函数原型 getColor() 函数说明 得到调色板的当前颜色。 函数原型 rootInit() 函数说明 调色板初始化。 3. DrawCanvas 类 函数原型 paint(java.awt.Graphics g) 函数说明 覆盖父类的paint函数,将缓冲画布的图像,写入工作区,以显示图片。 4. DrawingBuffer函数原型 getBuffer() 函数说明 得到该画布的缓冲图像。 函数原型 getGraphics() 函数说明 得到该画布的图形。 函数原型 open(java.io.File file) 函数说明 读取一个图像文件,建立缓冲画布。 函数原型 save(java.io.File f) 函数说明 将该缓冲画布保存为文件。 函数原型 setBuffer(java.awt.image.BufferedImage buffer) 函数说明 设置该画布的缓冲图像。 函数原型 setGraphics(java.awt.Graphics2D graphics) 函数说明 设置该画布的图形。 5. ImagePaser类(附加工具类) 函数原型 getNextImage() 函数说明 取得下个图标。 函数原型 getSubimage(int x, int y, int w, int h) 函数说明 根据指定的坐标和大小,获取图标。 函数原型 hasNextImage() 函数说明 是否还能取得下一个图标。 函数原型 setStartPosition(int x, int y) 函数说明 设置解析起始的左上点坐标 函数原型 setSubimageSize(int w, int h) 函数说明 设置所要解析图标的大小 6. ShapTool类 函数原型 getSelectIdx() 函数说明 得到当前工具栏所选择的工具 7. StatusBar类 函数原型 setShowPosition(int x, int y) 函数说明 设置目前鼠标的最新位置 函数原型 setShowSize(int width, int height) 函数说明 设置目前选取框的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值