一.函数原型

CString::GetBuffer

LPTSTR GetBuffer( int nMinBufLength );

throw( CMemoryException );

Return Value

An LPTSTR pointer to the object’s (null-terminated) character buffer.

Parameters

nMinBufLength

The minimum size of the character buffer in characters. This value does not include space for a null terminator.

Remarks

Returns a pointer to the internal character buffer for the CString object. The returned LPTSTR is notconst and thus allows direct modification of CString contents.

If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBufferbefore using any other CString member functions.

二.函数作用及使用范围

对一个CString变量,你可以使用的唯一合法转换符是LPCTSTR,直接转换成非常量指针(LPTSTR-[const] char*)是错误的。正确的得到一个指向缓冲区的非常量指针的方法是调用GetBuffer()方法。

GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能。

CString ::GetBuffer有两个重载版本:

LPTSTR GetBuffer( );LPTSTR GetBuffer(int nMinBufferLength);

在第二个版本中,当设定的长度小于原字符串长度时,nMinBufLength = nOldLen,该参数会被忽

略,不分配内存,指向原CString;当设定的长度大于原字符串本身的长度时就要重新分配(reallocate)一块比较大的空间出来。而调用第一个版本时,应如通过传入0来调用第二个版本一样。

是否需要在GetBufer后面调用ReleaseBuffer(),是根据你的后面的程序是否需要继续使用该字符串变量,并且是否动态改变其长度而定的。如果你GetBuffer以后程序自函数就退出,局部变量都不存在了,调用不调用ReleaseBuffer没什么意义了。

最典型的应用就是读取文件:

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,做简单测试:

测试1:

// example for CString::GetBuffer

#include <stdio.h>

#include <afx.h>

void main(void)

{

CString s( "abcd" );

printf("(1)before GetBuffer:\n");

printf("CString s.length=%d\n",s.GetLength());

printf("CString s=%s\n",s);

LPTSTR p = s.GetBuffer( 2 );

printf("(2)after GetBuffer and before ReleaseBuffer:\n");

printf("LPTSTR p=%s\n",p);

printf("p.length=%d\n",strlen(p));

printf("CString s=%s\n",s);

printf("CString s.length=%d\n",s.GetLength());

s.ReleaseBuffer( );

printf("(3)after ReleaseBuffer:\n");

printf("LPTSTR p=%s\n",p);

printf("p.length=%d\n",strlen(p));

printf("CString s=%s\n",s);

printf("CString s.length=%d\n",s.GetLength());

}

测试结果1:

(1)before GetBuffer:

CString s.length=4

CString s=abcd

(2)after GetBuffer and before ReleaseBuffer:

LPTSTR p=abcd

p.length=4

CString s=abcd

CString s.length=4

(3)after ReleaseBuffer:

LPTSTR p=abcd

p.length=4

CString s=abcd

CString s.length=4

Press any key to continue

测试2:

将LPTSTR p = s.GetBuffer( 2 ); 修改为:LPTSTR p = s.GetBuffer( 10 );

测试结果同1。

测试3:

在测试二的LPTSTR p = s.GetBuffer( 10 );后添加  p[5]='f';

测试结果同1。

测试4:

将测试三的p[5]='f';修改为p[4]='e';

测试结果4:

(1)before GetBuffer:

CString s.length=4

CString s=abcd

(2)after GetBuffer and before ReleaseBuffer:

LPTSTR p=abcde屯屯?

p.length=10

CString s=abcde屯屯?

CString s.length=4

(3)after ReleaseBuffer:

LPTSTR p=abcde屯屯?

p.length=10

CString s=abcde屯屯?

CString s.length=10

Press any key to continue

很显然(2)after GetBuffer and before ReleaseBuffer:中 CString s.length=4结果有问题。

MFC CString GetBuffer ReleaseBuffer方法相关推荐

  1. MFC CString GetBuffer/ReleaseBuffer 的使用条件

    今天为了通过串口往单片机里写一个16进制字符去控制单片机的adc的起停,结果糊涂到把'\x01'误写成'\0x01',怎么也得不到意想的结果,程序员有时候会犯低级错误,有时候怎么也跳不出去,这时候通过 ...

  2. MFC CString的GetBuffer()/ReleaseBuffer()

    CString GetBuffer()/ReleaseBuffer()两个方法的使用 LPTSTR GetBuffer(int nMinBufLength); void ReleaseBuffer(i ...

  3. Getbuffer ReleaseBuffer Cstring

    getbuffer是为了让你使用CString类中,保存字符串缓冲区的那块指针.     至于releasebuffer,在MSDN中有这样一句话.     If   you   use   the ...

  4. MFC中的CString类使用方法指南

    MFC中的CString类使用方法指南 原文出处:codeproject:CString Management [禾路:这是一篇比较老的资料了,但是对于MFC的程序设计很有帮助.我们在MFC中使用字符 ...

  5. CString 中Releasebuffer GetBuffer 相关实现原理

    一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryException ); Return V ...

  6. 精解CString类的GetBuffer,ReleaseBuffer 函数(VC++)

    CString的GetBuffer用法 一.函数原型 CString::GetBuffer LPTSTR GetBuffer( int nMinBufLength ); throw( CMemoryE ...

  7. CString:Getbuffer和Releasebuffer的作用

    首先看MSDN中的解释: CString::GetBuffer  LPTSTR GetBuffer( int nMinBufLength );    throw( CMemoryException ) ...

  8. Cstring GetBuffer 和 ReleaseBuffer

    GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定,使得CString对象在以后的代码中继续可以实现长度自适应增长的功能. CString ::GetBu ...

  9. CString GetBuffer() GetString()

    今天遇到了个棘手的问题, 弄了半天才搞定,在此记录下. 问题描述: MBCS工程中一个函数: void fun(CString& str1){     char *pstr = str1.Ge ...

最新文章

  1. 科普:Flume是啥?干嘛用的?
  2. java中insert函数
  3. 使用显式Intent向下一个活动传递数据
  4. boost::range_pointer相关的测试程序
  5. java数据库视频教程下载,【No147】最新oracle11g DBA 开发和应用数据库视频教程下载...
  6. python正则去除换行符,关于python:用于删除换行符的正则表达式
  7. Java中的数据库架构导航
  8. java中的显示初始化和特定初始化
  9. 作者:陈钧,男,中国国防科技信息中心高级工程师、研究室主任。
  10. STM32跑html协议,stm32实现1588协议
  11. mysql5.7 json特性_mysql5.7新增加的JSON数据类型特征介绍
  12. python爬取一条新闻内容_自己做语料——Python爬取新闻联播文字版
  13. 鸢尾花数据集分类--神经网络
  14. MEM专业学位论文选题与研究设计
  15. html+css 炫彩流光按钮
  16. 360email讲堂:中秋佳节邮件营销大放光彩
  17. 思科模拟器:通过一台三层交换机及两台二层交换机和6台电脑划分3个VLAN,并建立三个网关让电脑之间互通
  18. PS CC2019中英文切换方法
  19. JEECG 4.0版本发布,基于代码生成器的JAVA快速开发平台
  20. DC PowerCompiler 功耗相关的综合 userguide阅读笔记

热门文章

  1. onmouseleave和onmouseout之间的区别
  2. c语言编程stc秒分小时,【分享】 STC15F104W 做的定时器,附原理图、PCB、C程序
  3. BaiduPCS GoLang
  4. vue3 + video-player 播放视频
  5. 机器学习算法【11】--推荐系统实战
  6. (论文阅读)实例分割之PANet
  7. 零基础Bootstrap入门教程(0)--教程背景与目录
  8. JavaScript super关键字
  9. 什么是MVC,SSM中怎么体现MVC
  10. linux系统fsck.ext4,linux – 如何在fsck之后恢复损坏的ext4文件系统?