typedef struct _dataList
{
int  len;
char buf[BUFLEN]; // BUFLEN = 4096;
struct _dataList *next;
} DATALIST, *LPDATALIST;BOOL CMyComm::Read(char *buf, int *nLen)
{
if (m_pList == NULL) return FALSE;
    
LPDATALIST pData = m_pList;  // m_pList 为LPDATALIST 类型 的链表
m_pList = m_pList->next; printf("%d : %s\n", pData->len, pData->buf);   //这个输出的结果正确 memmove(buf, pData->buf, *nLen); printf("%d : %s\n", strlen(buf), buf); // 这个结果就不对,有时丢掉部分数据 *nLen = pData->len;

delete pData;
         pData = NULL;        return TRUE;
}char buf[4096]
CMyComm comm;
.............
comm.Read(buf, 4096);很多时候都得不到正确的结果,发现问题出在Read()函数的memcpy处,前后输出的结果不一致,
比如表中存了80个"5",后一个有时输出80个“5”,有时就没有80个。换成memmove也不行

解决方案 »

  1.   

    给你一招绝的:printf("%d : %s\n", pData->len, pData->buf);   //这个输出的结果正确 memmove(buf, pData->buf, *nLen); printf("%d : %s\n", strlen(buf), buf); // 这个结果就不对,有时丢掉部分数据
    修改为: printf("%d : %s\n", pData->len, pData->buf);   //这个输出的结果正确char *ppp;
    long  ll_len;
    ll_len = pData->len ;
    ppp = malloc(ll_len + 1 );
    memcpy(ppp,pData->buf,ll_len + 1 );
    memcpy(buf,ppp,ll_len + 1 );
    free(ppp)
    // memmove(buf, pData->buf, *nLen); printf("%d : %s\n", strlen(buf), buf); // 这个结果就不对,有时丢掉部分数据
    这样应该绝对正确了!
    原因嘛,,,自己猜!
      

  2.   

    nLen没有传值就用作Copy长度
    memmove(buf, pData->buf, *nLen);
    改为
    memmove(buf, pData->buf, pData->len+1);
      

  3.   

    把comm.Read(buf, 4096)改成comm.Read(buf, strlen(buf))试一下
      

  4.   

    链表保存的数据地址不一定是连续的,一定不能用memmove函数,对了只是碰巧
      

  5.   

    to GoldenSword(金错刀) ( )
     链表只是存放着结构体的指针,结构体是new 出来的
     LPDATALIST m_pList; //声明链表指针
     ... char *buf  = "1111111111111111111111111111111111";  //结链表的结构体赋值
     LPDATALIST pData  = new DATALIST;
     pData->len = strlen(buf);
     memcpy(pData->buf, buf, pData->len); 
     pData->next = m_pList;
     m_pList = pData;to 其他人:
      多谢,先试试你们的方法。