如下: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(), 则文件写入都是空的内容。

解决方案 »

  1.   

    CString可以直接强制转换成LPCTSTR来使用,这里相当于const char *
    sfile.Write(strTmp2,m_recData.GetLength()/2); 这里你写入的是strTmp2变量,不明白你为什么用m_recData来求写入的长度。
      

  2.   

    CString strTmp2; 
    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(); 
      

  3.   

    我原贴里面提到了,因为如果我直接用 strTmp2.GetLength(),得到的长度是0. 这样保存的时候就是空内容 百思不得其解…… 
      

  4.   

    仔细看你的代码:CString 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(); 
      

  5.   

    你要这样:
    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(); 
      

  6.   

    strTmp2.GetBuffer是取strTmp2中的char,不是赋值。
      

  7.   

    因为你先就执行了strTmp2.ReleaseBuffer(); 释放了后就没值了
    strTmp2.GetLength()就得到的是零!
      

  8.   


    不晓得就不要乱讲!!!strTmp2本身没有赋值,长度肯定为0啊!!
    不晓得lz到底疑惑么子??  
      

  9.   


    楼上说的非常错!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楼说的。
      

  10.   

    我主贴上可能没说明白。补充 如下绿色部分:我的意图就是, 直接让pNum指针指向strTmp2的内部字符串地址,然后,pNum做为参数在Str2Num()函数中被赋值。这个时候strTmp2也被赋值了。所以在下面的文件保存语句中, 可以直接把strTmp2的内容保存。
    现在问题就是, 实验证明, sfile.Write(strTmp2,m_recData.GetLength()/2);可以正确保存strTmp2的值,但是 sfile.Write(strTmp2,strTmp2.GetLength()/2);保存出来就是空的内容,单步执行发现strTmp2.GetLength()返回值是0。 
    这好像解释不通过
      

  11.   

    我的意图就是, 直接让pNum指针指向strTmp2的内部字符串地址,然后,pNum做为参数在Str2Num()函数中被赋值。这个时候strTmp2也被赋值了。所以在下面的文件保存语句中, 可以直接把strTmp2的内容保存。 
    现在问题就是, 实验证明, sfile.Write(strTmp2,m_recData.GetLength()/2);可以正确保存strTmp2的值,但是 sfile.Write(strTmp2,strTmp2.GetLength()/2);保存出来就是空的内容,单步执行发现st
      

  12.   

    我主贴上可能没说明白。补充 如下绿色部分:我的意图就是, 直接让pNum指针指向strTmp2的内部字符串地址,然后,pNum做为参数在Str2Num()函数中被赋值。这个时候strTmp2也被赋值了。所以在下面的文件保存语句中, 可以直接把strTmp2的内容保存。
    现在问题就是, 实验证明, sfile.Write(strTmp2,m_recData.GetLength()/2);可以正确保存strTmp2的值,但是 sfile.Write(strTmp2,strTmp2.GetLength()/2);保存出来就是空的内容,单步执行发现strTmp2.GetLength()返回值是0。 
    这好像解释不通过
      

  13.   


    strTmp2.releasebuff(m_recData.GetLength()/2);
    Str2Num(pNum, m_recData.GetBuffer(10), m_recData.GetLength());不知道你这一步做了什么
      

  14.   


    char *pNum=strTmp2.GetBuffer(m_recData.GetLength()/2); 
    并未改变strTmp2!!!只改变了pNum指向了strTmp2;你改变pNum指向的地址的内容 实际上改变了strTmp2指向的地址的内存中的内容!
    但是strTmp2,作为一个对象!先看一下它的定义
    我们首先要了解 CString 是一种很特殊的 C++ 对象,它是对一个用来存放字符串的缓冲区和对施加于这个字符串的操作封装。它里面包含了三个值,都是私有变量:一个指向某个数据缓冲区的指针、一个是该缓冲中有效的字符记数以及一个缓冲区长度。有效字符数的大小可以是从0到该缓冲最大长度值减1之间的任何数(因为字符串结尾有一个NULL 字符)。字符记数和缓冲区长度被巧妙隐藏。你改变了它数据缓冲区的内容 但是你没有改变它的长度以及 有效字符数所以你单步执行发现strTmp2.GetLength()返回值是0。 不知道我讲明白了没有!!
      

  15.   

    简单一点讲是 你通过pNum可以改变strTmp2数据缓冲区的值,这是直接在内存上的改变,但是你无法改变strTmp2的长度以及有效字符数
      

  16.   

    lz对后面获取的长度为0不解,干嘛不跟进去看看CString的实现呢?给我的一段测试代码你看看 CString strText;
    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);
    }
      

  17.   

    GetBuffer之后调用其他成员函数会得不到正确的结果,  调用其他成员之前 先调用ReleaseBuffer