|
맨 앞에 record를 삭제하고
맨 뒤에 하나 추가하는 거잖아요?
데이타가 String이라면 간단히 아래와 같이 하시면 될것입니다.
void __fastcall TForm1::AddNewLog(String sNewData)
{
String sFname="C:\\Data.dat";
TStringList *sLst=new TStringList;
sLst->LoadFromFile(sFname);
sLst->Add(sNewData);
if(sLst->Count>300)
sLst->Delete(0);
sLst->SaveToFile(sFname)
delete sLst;
}
//---------------------------------------------------------------------------
Binary라면 TFileStream을 이용해서
똑같이 작업하면 되겠죠
struct TStData
{
char buf[128];
};
void __fastcall TForm1::Button3Click(TObject *Sender)
{
TStData dt;
strcpy(dt.buf,"aslfdjaldjflad");
AddData((void*)&dt);
}
void __fastcall TForm1::AddData(void *data)
{
TStData dt;
memcpy(dt.buf,data,sizeof(dt));
String sFname="C:\\Data.dat";
TFileStream *fs;
if(!FileExists(sFname))fs=new TFileStream(sFname,fmCreate );
else fs=new TFileStream(sFname,fmOpenReadWrite );
fs->Seek(fs->Size,soFromBeginning);
fs->Write(&dt,sizeof(dt));
if(fs->Size>sizeof(dt)*300)
{
fs->Seek(sizeof(dt),soFromBeginning);
TStData dtArr[300];
fs->Read(dtArr,sizeof(dtArr));
fs->Seek(0,soFromBeginning);
fs->Write(dtArr,sizeof(dtArr));
fs->Size=sizeof(dt)*300;
}
delete fs;
}
//---------------------------------------------------------------------------
파일이 큰경우에는?
그런데 Record가 크기 않으면 별 문제될것 없을수 있겠지만
Record 유지수가 300개가 아니라 엄청 많아진다면, 또는 총 유지 filesize가 엄청 크다면 어떻게 될까요?
1번 방법은 무조건 처음부터 끝까지 다시 기록하구
2번 방법은 size가 오버하면 전부다 읽어와서 앞쪽으로 통째로 땡기는 작업을 합니다.
위와같이 처음부터 끊까지 다시 file에 기록하는 방법말고 다른방법은 없을까요?
만약 파일을 읽어서 사용자에게 보여줄때 정렬만 다시한다면
size고정하고 하나의 recored size만큼만 file에 write하는 방법이 있을것 같은데요..
연구함 해보세요, 그러면 성능이 더욱 좋아질듯..
그럼..
조상진 님이 쓰신 글 :
: 안녕하세요... __);
:
: 여러곳에서 전송받는 데이터를 파일에 라인단위로 최대 300라인까지만 기록합니다.
: 새로운 데이터가 전송되었을 때에는 제일 오래된 데이터를 삭제한 후에 추가를 하여 파일은 항상
: 최대로 300라인까지만 입력이 가능한 것입니다.
:
: 예를 들자면..
:
: 장치1-어쩌고 (1라인)
: 장치2-어쩌고
: 장치1-어쩌고
: 장치4-어쩌고
: ...
: 장치3-어쩌고 (300라인)
:
: 이렇게 300라인까지 등록된 상태에서 데이터를 다시 전송받으면
:
: 맨처음 1라인을 지우고 새로 전송받은 데이터를 넣습니다.
:
: 장치1-어쩌고 (1라인) -> 삭제
: 장치2-어쩌고
: 장치1-어쩌고
: 장치4-어쩌고
: ...
: 장치3-어쩌고 (300라인) -> 299 라인이됨
: 장치1-어쩌고 (300라인=새로전송받은 데이터)
:
: 파일에다가 바로 이렇게 오래된 항목을 지우며 새로 내용을 추가하는 작업을 해본적이 없어서
: 한번에 감이 안오는데요. 어떻게 하면 될려는지요?
:
: 그럼.. __); 부탁드립니다~
|