我在函数ReadOrderRecord中读取一个.DBD文件,文件内容很简单,如下:
000001000100          J041118AB4398  1    O
000002000100          J041118AB4398  1    O
000003000100          J041216BB4300  1    O
000001000100          J041118AB4398  1    O
000002000100          J041118AB4398  1    O
000003000100          J041118AS4398  1    O
000004000100          J041118BB4302  1    O
000005000100          J041118BS4302  1    O
000006000100          J041216BS4300  1    O
000007000100          J041216BB4300  1    O
其中,前六行是两两重复的,我想在读取时遇到重复的就不读,遇到不重复的继续读,不知道应该在源程序中怎么修改,源代码如下:
BOOL CMTIClient::ReadOrderRecord(QueryOrderRequestPacket **ppRequest, int &iCount)
{
CString strFileName;
strFileName.Format("%s.DRD", m_strTraderID);
CStdioFile fRecord;
if( fRecord.Open(strFileName,
CFile::modeNoTruncate
| CFile::modeRead
| CFile::typeText
| CFile::shareExclusive)==0 )
{
//AfxMessageBox("打开文件失败");
return FALSE;
} vector<QueryOrderRequestPacket> vOrderRequest;
CString strBuff;
while ( fRecord.ReadString(strBuff) )
{
QueryOrderRequestPacket order;
memset(&order, 0, sizeof(QueryOrderRequestPacket)); strcpy(order.szTraderID_, m_strTraderID); int iOffset = 0;
strcpy(order.szOrderNo, strBuff.Mid(iOffset, SIZE_RECORD_ORDERNO));
iOffset += SIZE_RECORD_ORDERNO; strcpy(order.szCustomerID_, strBuff.Mid(iOffset, TRADER_ID_LEN));
iOffset += TRADER_ID_LEN; strcpy(order.szMarket, strBuff.Mid(iOffset, SIZE_RECORD_MARKETID));
iOffset += SIZE_RECORD_MARKETID; strcpy(order.szCommodityID, strBuff.Mid(iOffset, SIZE_RECORD_COMMODITYID));
iOffset += SIZE_RECORD_COMMODITYID; order.cBuySell = strBuff.GetAt(iOffset);
iOffset += SIZE_RECORD_BUYSELL; vOrderRequest.push_back(order);
}
fRecord.Close(); iCount = vOrderRequest.size();
*ppRequest = new QueryOrderRequestPacket[iCount];
for (int i=0; i<iCount; i++)
{
memcpy(*ppRequest+i, &vOrderRequest.at(i), sizeof(QueryOrderRequestPacket));
} TRACE1("读到%d条记录\n",iCount); return TRUE;
}
请高手教教我,详细点儿啊,我是新手!!

解决方案 »

  1.   

    BOOL CMTIClient::ReadOrderRecord(QueryOrderRequestPacket **ppRequest, int &iCount)
    {
    CString strFileName;
    strFileName.Format("%s.DRD", m_strTraderID);
    CStdioFile fRecord;
    if( fRecord.Open(strFileName,
    CFile::modeNoTruncate
    | CFile::modeRead
    | CFile::typeText
    | CFile::shareExclusive)==0 )
    {
    //AfxMessageBox("打开文件失败");
    return FALSE;
    } vector<QueryOrderRequestPacket> vOrderRequest;
    CString strBuff;
    //修改处
             CPtrArray  strList;
             bool Tag=false;
    while ( fRecord.ReadString(strBuff) )
    {//修改处
                  for(int i=0;i<strList.GetSize();i++)
                {
                    if(strcmp(strBuff,strList.GetAt(i))==0)
                    Tag=true;
                 }
                  if(Tag)
                  {
                      Tag=false;
                      continue;
                   }
    ______________________________________________
    QueryOrderRequestPacket order;
    memset(&order, 0, sizeof(QueryOrderRequestPacket)); strcpy(order.szTraderID_, m_strTraderID); int iOffset = 0;
    strcpy(order.szOrderNo, strBuff.Mid(iOffset, SIZE_RECORD_ORDERNO));
    iOffset += SIZE_RECORD_ORDERNO; strcpy(order.szCustomerID_, strBuff.Mid(iOffset, TRADER_ID_LEN));
    iOffset += TRADER_ID_LEN; strcpy(order.szMarket, strBuff.Mid(iOffset, SIZE_RECORD_MARKETID));
    iOffset += SIZE_RECORD_MARKETID; strcpy(order.szCommodityID, strBuff.Mid(iOffset, SIZE_RECORD_COMMODITYID));
    iOffset += SIZE_RECORD_COMMODITYID; order.cBuySell = strBuff.GetAt(iOffset);
    iOffset += SIZE_RECORD_BUYSELL; vOrderRequest.push_back(order);
    }
    fRecord.Close(); iCount = vOrderRequest.size();
    *ppRequest = new QueryOrderRequestPacket[iCount];
    for (int i=0; i<iCount; i++)
    {
    memcpy(*ppRequest+i, &vOrderRequest.at(i), sizeof(QueryOrderRequestPacket));
    } TRACE1("读到%d条记录\n",iCount); return TRUE;
    }
      

  2.   

    不好意思,刚才写少了一句
    BOOL CMTIClient::ReadOrderRecord(QueryOrderRequestPacket **ppRequest, int &iCount)
    {
    CString strFileName;
    strFileName.Format("%s.DRD", m_strTraderID);
    CStdioFile fRecord;
    if( fRecord.Open(strFileName,
    CFile::modeNoTruncate
    | CFile::modeRead
    | CFile::typeText
    | CFile::shareExclusive)==0 )
    {
    //AfxMessageBox("打开文件失败");
    return FALSE;
    } vector<QueryOrderRequestPacket> vOrderRequest;
    CString strBuff;
    //修改处
             CPtrArray  strList;
             bool Tag=false;
    while ( fRecord.ReadString(strBuff) )
    {//修改处
                  for(int i=0;i<strList.GetSize();i++)
                {
                    if(strcmp(strBuff,strList.GetAt(i))==0)
                    Tag=true;
                 }
                  if(Tag)
                  {
                      Tag=false;
                      continue;
                   }
                       strList.Add(strBuff);
    ______________________________________________
    QueryOrderRequestPacket order;
    memset(&order, 0, sizeof(QueryOrderRequestPacket)); strcpy(order.szTraderID_, m_strTraderID); int iOffset = 0;
    strcpy(order.szOrderNo, strBuff.Mid(iOffset, SIZE_RECORD_ORDERNO));
    iOffset += SIZE_RECORD_ORDERNO; strcpy(order.szCustomerID_, strBuff.Mid(iOffset, TRADER_ID_LEN));
    iOffset += TRADER_ID_LEN; strcpy(order.szMarket, strBuff.Mid(iOffset, SIZE_RECORD_MARKETID));
    iOffset += SIZE_RECORD_MARKETID; strcpy(order.szCommodityID, strBuff.Mid(iOffset, SIZE_RECORD_COMMODITYID));
    iOffset += SIZE_RECORD_COMMODITYID; order.cBuySell = strBuff.GetAt(iOffset);
    iOffset += SIZE_RECORD_BUYSELL; vOrderRequest.push_back(order);
    }
    fRecord.Close(); iCount = vOrderRequest.size();
    *ppRequest = new QueryOrderRequestPacket[iCount];
    for (int i=0; i<iCount; i++)
    {
    memcpy(*ppRequest+i, &vOrderRequest.at(i), sizeof(QueryOrderRequestPacket));
    } TRACE1("读到%d条记录\n",iCount); return TRUE;
    }
      

  3.   

    我编译了下,出现两个错误:
    1.error C2664: 'strcmp' : cannot convert parameter 2 from 'void *' to 'const char *'
    Conversion from 'void*' to pointer to non-'void' requires an explicit cast
    错误指向语句:
    if(strcmp(strBuff,strList.GetAt(i))==0)
    2.error C2664: 'Add' : cannot convert parameter 1 from 'class CString' to 'void *'
    No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    错误指向语句:
    strList.Add(strBuff);请问现在应该怎么改?谢谢
      

  4.   

    CPtrArray  strList;=>
    改成CStringArray