STL을 이용해서 파일로그 처리를 하려고 합니다.
글쓴이: luscent / 작성시간: 금, 2004/04/09 - 1:42오후
typedef struct {
char *intnr;
char *intdate;
char *inttime;
unsigned int internr;
unsigned int status;
unsigned int contab;
unsigned int tottime;
unsigned int itutime;
unsigned int area;
unsigned int teltime;
unsigned int scrcnt;
} IV;
typedef map<char * , vector<IV *> > htIv;
bool splitToVector(char *line, IV* iv, TTreeView *tv)
{
//Vector;
vector<IV *> v;
char msgstring[100];
if(iv == NULL)
{
MessageDlg("메모리 초기화에 실패하였습니다. \n\n프로그램을 종료합니다!", mtInformation , TMsgDlgButtons() << mbOK, 0);
exit(1);
return false;
}
AnsiString *ans = new AnsiString(line);
iv->intnr = (char *)malloc(8+1);
strcpy(iv->intnr,ans->SubString(1,8).c_str());
iv->intdate = (char *)malloc(8+1);
strcpy(iv->intdate,ans->SubString(9, 8).c_str()) ;
iv->inttime = (char *)malloc(4+1);
strcpy(iv->inttime,ans->SubString(17,4).c_str()) ;
iv->internr = atoi(ans->SubString(21,8).c_str());
iv->status = atoi(ans->SubString(29,2).c_str());
iv->contab = atoi(ans->SubString(31,2).c_str());
iv->tottime = atoi(ans->SubString(33,6).c_str());
iv->itutime = atoi(ans->SubString(39,6).c_str());
iv->area = atoi(ans->SubString(45,6).c_str());
iv->teltime = atoi(ans->SubString(51,6).c_str());
iv->scrcnt = atoi(ans->SubString(57,4).c_str());
//retrieve;
if(ht_of_InterViewer[iv->intnr].empty())
{
v.push_back(iv);
ht_of_InterViewer[iv->intnr] = v;
ShowMessage(ht_of_InterViewer[iv->intnr][0]->intnr );
}
else
{
ht_of_InterViewer[iv->intnr].push_back(iv);
ShowMessage(ht_of_InterViewer[iv->intnr][ht_of_InterViewer[iv->intnr].size()]->intnr );
}
tv->Items->Add(NULL, iv->intnr);
sprintf(msgstring, "%s 의 아이템 개수는 %d 개 입니다", iv->intnr, ht_of_InterViewer[iv->intnr].size());
ShowMessage(msgstring);
tv->Repaint() ;
tv->Refresh() ;
return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int fd, bytes=0;
char *buf = (char *)malloc(MAXLINELENGTH+1);
TTreeNode *node;
vector<IV *>v;
IV *iv;
if(OpenDialog1->Execute())
if((fd = open(OpenDialog1->FileName.c_str(), O_RDONLY)) == -1)
{
ShowMessage("파일을 열수 없습니다");
return ;
}
TreeView1->Items->Clear();
TreeView1->Items->Add(NULL, OpenDialog1->GetNamePath() );
node = TreeView1->Items->Item[0];
while(read(fd, buf, MAXLINELENGTH+1))
{
iv = (IV *)malloc(sizeof(IV));
bytes += MAXLINELENGTH;
splitToVector(buf, iv, this->TreeView1);
}
ShowMessage("파일 로딩이 끝났습니다");
free(buf);
close(fd);
}
소스를 첨부하였습니다.
위의 소스는 12만개의 라인이 저장되어 있는 텍스트 파일을
IV구조체형식으로 저장하고
제일 앞의 8자리를 키로 하여
map<char *, vector<IV *> >으로 저장하려고 하는 소스입니다.
메모리 부분이나. map으로 저장하는 부분에 어떤 점이 잘못되어져 있는지
(사실 stl을 처음 씁니다. ) 도움 부탁드립니다.
Forums:


STL에 포인터를 담으면, '못찾습니다'.포인터는 주소값이기 때
STL에 포인터를 담으면, '못찾습니다'.
포인터는 주소값이기 때문에, 새로 malloc한 주소와 이전에 넣은 주소가 다를수 밖에 없습니다.
std::string을 사용하시거나, 혹은 별도의 비교 함수를 제공해주셔야합니다.
댓글 달기