BOOL DBCFile::OpenFromMemoryImpl_Text(const CHAR* pMemory, const CHAR* pDeadEnd, const CHAR* szFileName) { //---------------------------------------------------- //分析列数和类型 CHAR szLine[1024*10] = {0}; //读第一行 register const char* pMem = pMemory; pMem = _GetLineFromMemory(szLine, 1024*10, pMem, pDeadEnd); if(!pMem) return FALSE; //分解 vector< std::string > vRet; _ConvertStringToVector(szLine, vRet, "\t", TRUE, TRUE); if(vRet.empty()) return FALSE; //生成Field Types FILEDS_TYPE vFieldsType; vFieldsType.resize(vRet.size()); for(INT i=0; i<(INT)vRet.size(); i++) { if(vRet[i] == "INT") vFieldsType[i] = T_INT; else if(vRet[i] == "FLOAT") vFieldsType[i] = T_FLOAT; else if(vRet[i] == "STRING") vFieldsType[i] = T_STRING; else { return FALSE; } } //-------------------------------------------------------------- //初始化 INT nRecordsNum = 0; INT nFieldsNum = (INT)vFieldsType.size(); //临时字符串区 vector< std::pair< std::string, INT > > vStringBuf; //检索表 std::map< std::string, INT > mapStringBuf; //-------------------------------------------------------------- //开始读取 //空读一行 pMem = _GetLineFromMemory(szLine, 1024*10, pMem, pDeadEnd); if(!pMem) return FALSE; INT nStringBufSize = 0; do { //读取一行 pMem = _GetLineFromMemory(szLine, 1024*10, pMem, pDeadEnd); if(!pMem) break;; //是否是注释行 if(szLine[0] == '#') continue; //分解 _ConvertStringToVector(szLine, vRet, "\t", TRUE, FALSE); //列数不对 if(vRet.empty()) continue; if(vRet.size() != nFieldsNum) { //补上空格 if((INT)vRet.size() < nFieldsNum) { INT nSubNum = nFieldsNum-(INT)vRet.size(); for(INT i=0; i<nSubNum; i++) { vRet.push_back(""); } } } //第一列不能为空 if(vRet[0].empty()) continue; for(register INT i=0; i<nFieldsNum; i++) { FIELD newField; switch(vFieldsType[i]) { case T_INT: newField.iValue = atoi(vRet[i].c_str()); m_vDataBuf.push_back(newField); break; case T_FLOAT: newField.fValue = (FLOAT)atof(vRet[i].c_str()); m_vDataBuf.push_back(newField); break; case T_STRING: if(vRet[i].empty()) { newField.iValue = 0; } else { const CHAR * p = vRet[i].c_str(); std::map< std::string, INT >::iterator it = mapStringBuf.find(vRet[i]); if(it == mapStringBuf.end()) { vStringBuf.push_back(std::make_pair(vRet[i], nStringBufSize)); mapStringBuf.insert(std::make_pair(vRet[i], (INT)vStringBuf.size()-1)); newField.iValue = nStringBufSize + 1; // first CHAR is '\0' for blank string nStringBufSize += (INT)strlen(vRet[i].c_str()) + 1; } else { newField.iValue = vStringBuf[it->second].second + 1; } } m_vDataBuf.push_back(newField); break; } } nRecordsNum++; }while(TRUE); //-------------------------------------------------------- //生成正式数据库 m_nRecordsNum = nRecordsNum; m_nFieldsNum = nFieldsNum; m_nStringBufSize = nStringBufSize+1; //Create String Blok m_pStringBuf = new CHAR[m_nStringBufSize]; if(!m_pStringBuf) return FALSE; //------------------------------------------------------ // Create Field Types m_theType = vFieldsType; //------------------------------------------------------ // Create String Block UCHAR byBlank = '\0'; m_pStringBuf[0] = '\0'; register CHAR* p = m_pStringBuf + 1; for(INT i=0; i<(INT)vStringBuf.size(); i++) { memcpy(p, vStringBuf[i].first.c_str(), vStringBuf[i].first.size()); p += vStringBuf[i].first.size(); *(p++) = '\0'; } //------------------------------------------------------ // Relocate String Block for(register INT i=0; i<nFieldsNum; i++) { if(vFieldsType[i] != T_STRING) continue; for(register INT j=0; j<nRecordsNum; j++) { FIELD& theField = m_vDataBuf[j*nFieldsNum+i]; theField.pString = m_pStringBuf + theField.iValue; } } //------------------------------------------------------ //生成索引列 CreateIndex(0, szFileName); return TRUE; }
BOOL DBCFile::OpenFromTXT(const CHAR* szFileName) { assert(szFileName); //---------------------------------------------------- //打开文件 FILE* fp = fopen(szFileName, "r"); if(NULL == fp) return FALSE; //---------------------------------------------------- //分析列数和类型 CHAR szLine[1024*10]; //读第一行 fgets(szLine, 1024*10, fp); size_t nLen; if((nLen=strlen(szLine)) != 0) if(szLine[nLen-1] == '\r' || szLine[nLen-1] == '\n') szLine[nLen-1] = '\0'; if((nLen=strlen(szLine)) != 0) if(szLine[nLen-1] == '\r' || szLine[nLen-1] == '\n') szLine[nLen-1] = '\0'; //分解 std::vector< std::string > vRet; _ConvertStringToVector(szLine, vRet, "\t", TRUE, TRUE); if(vRet.empty()) return FALSE; //生成Field Types FILEDS_TYPE vFieldsType; vFieldsType.resize(vRet.size()); for(INT i=0; i<(INT)vRet.size(); i++) { if(vRet[i] == "INT") vFieldsType[i] = T_INT; else if(vRet[i] == "FLOAT") vFieldsType[i] = T_FLOAT; else if(vRet[i] == "STRING") vFieldsType[i] = T_STRING; else { fclose(fp); return FALSE; } } //-------------------------------------------------------------- //初始化 INT nRecordsNum = 0; INT nFieldsNum = (INT)vFieldsType.size(); //临时字符串区 std::vector< std::pair< std::string, INT > > vStringBuf; //检索表 std::map< std::string, INT > mapStringBuf; //-------------------------------------------------------------- //开始读取 fgets(szLine, 1024*10, fp); //空读一行 INT nStringBufSize = 0; do { //读取一行 if(NULL == fgets(szLine, 1024*10, fp)) break; if((nLen=strlen(szLine)) == 0) continue; if(szLine[nLen-1] == '\r' || szLine[nLen-1] == '\n') szLine[nLen-1] = '\0'; if((nLen=strlen(szLine)) == 0) continue; if(szLine[nLen-1] == '\r' || szLine[nLen-1] == '\n') szLine[nLen-1] = '\0'; //分解 _ConvertStringToVector(szLine, vRet, "\t", TRUE, FALSE); //列数不对 if(vRet.empty()) continue; if(vRet.size() != nFieldsNum) { //补上空格 if((INT)vRet.size() < nFieldsNum) { INT nSubNum = nFieldsNum-(INT)vRet.size(); for(INT i=0; i<nSubNum; i++) { vRet.push_back(""); } } } //第一列不能为空 if(vRet[0].empty()) continue; for(register INT i=0; i<(INT)vRet.size(); i++) { FIELD newField; switch(vFieldsType[i]) { case T_INT: newField.iValue = atoi(vRet[i].c_str()); m_vDataBuf.push_back(newField); break; case T_FLOAT: newField.fValue = (FLOAT)atof(vRet[i].c_str()); m_vDataBuf.push_back(newField); break; case T_STRING: if(vRet[i].empty()) { newField.iValue = 0; } else { const CHAR * p = vRet[i].c_str(); std::map< std::string, INT >::iterator it = mapStringBuf.find(vRet[i]); if(it == mapStringBuf.end()) { vStringBuf.push_back(std::make_pair(vRet[i], nStringBufSize)); mapStringBuf.insert(std::make_pair(vRet[i], (INT)vStringBuf.size()-1)); newField.iValue = nStringBufSize + 1; // first CHAR is '\0' for blank string nStringBufSize += (INT)strlen(vRet[i].c_str()) + 1; } else { newField.iValue = vStringBuf[it->second].second + 1; } } m_vDataBuf.push_back(newField); break; } } nRecordsNum++; }while(TRUE); fclose(fp); //-------------------------------------------------------- //生成正式数据库 m_nRecordsNum = nRecordsNum; m_nFieldsNum = nFieldsNum; m_nStringBufSize = nStringBufSize+1; //Create String Blok m_pStringBuf = new CHAR[m_nStringBufSize]; if(!m_pStringBuf) return FALSE; //------------------------------------------------------ // Create Field Types m_theType = vFieldsType; //------------------------------------------------------ // Create String Block UCHAR byBlank = '\0'; m_pStringBuf[0] = '\0'; register CHAR* p = m_pStringBuf + 1; for(INT i=0; i<(INT)vStringBuf.size(); i++) { memcpy(p, vStringBuf[i].first.c_str(), vStringBuf[i].first.size()); p += vStringBuf[i].first.size(); *(p++) = '\0'; } //------------------------------------------------------ // Relocate String Block for(register INT i=0; i<nFieldsNum; i++) { if(vFieldsType[i] != T_STRING) continue; for(register INT j=0; j<nRecordsNum; j++) { FIELD& theField = m_vDataBuf[j*nFieldsNum+i]; theField.pString = m_pStringBuf + theField.iValue; } } //------------------------------------------------------ //生成索引列 CreateIndex(szFileName, 0); return TRUE; }