如下:CString strTmp2;
char *pNum=strTmp2.GetBuffer(m_recData.GetLength()/2); //m_recData也是个CString的变量
Str2Num(pNum, m_recData.GetBuffer(10), m_recData.GetLength());//一个转换函数,可忽略
m_recData.ReleaseBuffer();//释放
strTmp2.ReleaseBuffer();//保存转换完的数据//lyl: Feb,9,2010//OK
CFile sfile("rcvData.dat", CFile::modeCreate|CFile::modeWrite);
sfile.Write(strTmp2,m_recData.GetLength()/2);
sfile.Close(); //红色部分如果用 strTmp2.GetLength(), 则文件写入都是空的内容。
char *pNum=strTmp2.GetBuffer(m_recData.GetLength()/2); //m_recData也是个CString的变量
Str2Num(pNum, m_recData.GetBuffer(10), m_recData.GetLength());//一个转换函数,可忽略
m_recData.ReleaseBuffer();//释放
strTmp2.ReleaseBuffer();//保存转换完的数据//lyl: Feb,9,2010//OK
CFile sfile("rcvData.dat", CFile::modeCreate|CFile::modeWrite);
sfile.Write(strTmp2,m_recData.GetLength()/2);
sfile.Close(); //红色部分如果用 strTmp2.GetLength(), 则文件写入都是空的内容。
解决方案 »
- 请教一个查找窗口句柄的技巧
- 为什么在VC2005里可以运行,而在Debug文件夹里点击就运行不了
- qq聊天是用的p2p吗?
- 各位大人啊, DREAMWEAVER中中, 在代码窗口中选择元素, 自动在设计窗口中相应的元素也被选中, 这个功能是怎么实现的啊
- MSDN上的一段文字,不理解,求翻译.
- 初学者请教:如何将一幅位图在VC中显示,并显示出位图的信息,如各像素点的值等?谢谢了!
- CBrush作为类的静态成员创建的方法???
- DAO+ACCESS2000+VC6.0问题求高手帮忙
- 怎样编写和调试带有命令行参数的VC单文档程序!
- Rigel(猎户座-参宿七) 辞职了,高兴啊,散分了!(6)
- VC 将文字(带字体、颜色格式)、表情、图片打包成XML格式
- 禁用 拨号上网
sfile.Write(strTmp2,m_recData.GetLength()/2); 这里你写入的是strTmp2变量,不明白你为什么用m_recData来求写入的长度。
char *pNum=strTmp2.GetBuffer(m_recData.GetLength()/2); //m_recData也是个CString的变量
Str2Num(pNum, m_recData.GetBuffer(10), m_recData.GetLength());//一个转换函数,可忽略
//保存转换完的数据//lyl: Feb,9,2010//OK
CFile sfile("rcvData.dat", CFile::modeCreate|CFile::modeWrite);
sfile.Write(strTmp2,m_recData.GetLength()/2);
sfile.Close(); 放在下面:
m_recData.ReleaseBuffer();//释放
strTmp2.ReleaseBuffer();
char *pNum=strTmp2.GetBuffer(m_recData.GetLength()/2); //这里的 strTmp2没有值
m_recData.ReleaseBuffer();//释放
strTmp2.ReleaseBuffer(); //保存转换完的数据//lyl: Feb,9,2010//OK
CFile sfile("rcvData.dat", CFile::modeCreate|CFile::modeWrite);
sfile.Write(strTmp2,m_recData.GetLength()/2); // 这里肯定是空
sfile.Close();
CString strTmp2;
strTmp2 = ???? // 这里要给strTmp2一个值
char *pNum=strTmp2.GetBuffer(m_recData.GetLength()/2); //否则这里的 strTmp2没有值
m_recData.ReleaseBuffer();//释放
strTmp2.ReleaseBuffer(); //保存转换完的数据//lyl: Feb,9,2010//OK
CFile sfile("rcvData.dat", CFile::modeCreate|CFile::modeWrite);
sfile.Write(strTmp2,m_recData.GetLength()/2); // 那么这里肯定是空
sfile.Close();
strTmp2.GetLength()就得到的是零!
不晓得就不要乱讲!!!strTmp2本身没有赋值,长度肯定为0啊!!
不晓得lz到底疑惑么子??
楼上说的非常错!strTmp2包括类成员和characters buffer;strTmp2.GetBuffer()是取得类对象中characters buffer的指针;strTmp2.ReleaseBuffer()是释放通过strTmp2.GetBuffer()取得的characters buffer的控制,并没有释放类成员和它的characters buffer值。strTmp2.GetLength()是取得类对象中characters buffer的长度;----------------------------------在代码上,strTmp2.ReleaseBuffer()放在下面为好,我在2楼说的;
楼主真正的错误,是没有对strTmp2进行赋值,我在5、6楼说的。
现在问题就是, 实验证明, sfile.Write(strTmp2,m_recData.GetLength()/2);可以正确保存strTmp2的值,但是 sfile.Write(strTmp2,strTmp2.GetLength()/2);保存出来就是空的内容,单步执行发现strTmp2.GetLength()返回值是0。
这好像解释不通过
现在问题就是, 实验证明, sfile.Write(strTmp2,m_recData.GetLength()/2);可以正确保存strTmp2的值,但是 sfile.Write(strTmp2,strTmp2.GetLength()/2);保存出来就是空的内容,单步执行发现st
现在问题就是, 实验证明, sfile.Write(strTmp2,m_recData.GetLength()/2);可以正确保存strTmp2的值,但是 sfile.Write(strTmp2,strTmp2.GetLength()/2);保存出来就是空的内容,单步执行发现strTmp2.GetLength()返回值是0。
这好像解释不通过
strTmp2.releasebuff(m_recData.GetLength()/2);
Str2Num(pNum, m_recData.GetBuffer(10), m_recData.GetLength());不知道你这一步做了什么
char *pNum=strTmp2.GetBuffer(m_recData.GetLength()/2);
并未改变strTmp2!!!只改变了pNum指向了strTmp2;你改变pNum指向的地址的内容 实际上改变了strTmp2指向的地址的内存中的内容!
但是strTmp2,作为一个对象!先看一下它的定义
我们首先要了解 CString 是一种很特殊的 C++ 对象,它是对一个用来存放字符串的缓冲区和对施加于这个字符串的操作封装。它里面包含了三个值,都是私有变量:一个指向某个数据缓冲区的指针、一个是该缓冲中有效的字符记数以及一个缓冲区长度。有效字符数的大小可以是从0到该缓冲最大长度值减1之间的任何数(因为字符串结尾有一个NULL 字符)。字符记数和缓冲区长度被巧妙隐藏。你改变了它数据缓冲区的内容 但是你没有改变它的长度以及 有效字符数所以你单步执行发现strTmp2.GetLength()返回值是0。 不知道我讲明白了没有!!
TCHAR* pChar = strText.GetBuffer( 50 );
_tcscpy( pChar, _T("GetBuffer test...") );
TRACE( _T("strText:%s; len:%d \n"), strText, strText.GetLength() ); strText.ReleaseBuffer();
TRACE( _T("strText:%s; len:%d \n"), strText, strText.GetLength() );
打印的日志如下:
strText:GetBuffer test...; len:0 // 这个由于还没有调用ReleaseBuffer,所以长度还没有设
strText:GetBuffer test...; len:17 // 这个调用了之后,默认参数是-1,所以获取的是拷贝的长度
CString strTmp2;
char *pNum=strTmp2.GetBuffer(m_recData.GetLength()/2); //只是获取一个指针而已
Str2Num(pNum, m_recData.GetBuffer(10), m_recData.GetLength());//对这个指针的内存赋值
m_recData.ReleaseBuffer();//释放
strTmp2.ReleaseBuffer(); // 看下面的实现,你的pNum有没有结尾符?// 所以你这个问题还是在你的Str2Num这个函数中,
// 如果你的这个函数没有对PNum赋值的话,只是对这个指针指向什么的做修改就会出问题。
// 你要是这样干嘛不new一个char数组出来而用CString呢?看看这个文件中的实现吧
C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\STRCORE.CPP
struct CStringData
{
long nRefs; // reference count
int nDataLength; // length of data (including terminator)
int nAllocLength; // length of allocation
// TCHAR data[nAllocLength] TCHAR* data() // TCHAR* to managed data
{ return (TCHAR*)(this+1); }
};_AFX_INLINE int CString::GetLength() const
{ return GetData()->nDataLength; }_AFX_INLINE CStringData* CString::GetData() const
{ ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }LPTSTR CString::GetBuffer(int nMinBufLength)
{
ASSERT(nMinBufLength >= 0); if (GetData()->nRefs > 1 || nMinBufLength > GetData()->nAllocLength)
{
#ifdef _DEBUG
// give a warning in case locked string becomes unlocked
if (GetData() != _afxDataNil && GetData()->nRefs < 0)
TRACE0("Warning: GetBuffer on locked CString creates unlocked CString!\n");
#endif
// we have to grow the buffer
CStringData* pOldData = GetData();
int nOldLen = GetData()->nDataLength; // AllocBuffer will tromp it
if (nMinBufLength < nOldLen)
nMinBufLength = nOldLen;
AllocBuffer(nMinBufLength);
memcpy(m_pchData, pOldData->data(), (nOldLen+1)*sizeof(TCHAR));
GetData()->nDataLength = nOldLen;
CString::Release(pOldData);
}
ASSERT(GetData()->nRefs <= 1); // return a pointer to the character storage for this string
ASSERT(m_pchData != NULL);
return m_pchData;
}void CString::ReleaseBuffer(int nNewLength)
{
CopyBeforeWrite(); // just in case GetBuffer was not called if (nNewLength == -1)
nNewLength = lstrlen(m_pchData); // zero terminated ASSERT(nNewLength <= GetData()->nAllocLength);
GetData()->nDataLength = nNewLength;
m_pchData[nNewLength] = '\0';
}void CString::CopyBeforeWrite()
{
if (GetData()->nRefs > 1)
{
CStringData* pData = GetData();
Release();
AllocBuffer(pData->nDataLength);
memcpy(m_pchData, pData->data(), (pData->nDataLength+1)*sizeof(TCHAR));
}
ASSERT(GetData()->nRefs <= 1);
}