C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[50842] Re:오래된 항목을 삭제하면서 파일에 쓰기
장성호 [nasilso] 1355 읽음    2007-10-12 09:31
맨 앞에 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라인=새로전송받은 데이터)
:
: 파일에다가 바로 이렇게 오래된 항목을 지우며 새로 내용을 추가하는 작업을 해본적이 없어서
: 한번에 감이 안오는데요. 어떻게 하면 될려는지요?
:
: 그럼.. __); 부탁드립니다~

+ -

관련 글 리스트
50827 오래된 항목을 삭제하면서 파일에 쓰기 조상진 1074 2007/10/11
50842     Re:오래된 항목을 삭제하면서 파일에 쓰기 장성호 1355 2007/10/12
50880         Re:Re:답변 진심으로 감사드립니다.(아참.. 과제에 대한것 추가입니다.) 조상진 858 2007/10/15
50841     Re:오래된 항목을 삭제하면서 파일에 쓰기 정성훈.해미 1159 2007/10/12
50881         Re:Re:답변 진심으로 감사드립니다.. __); 조상진 899 2007/10/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.