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
[3102] [질문]벌레좀 잡아주셔요....제발
무명씨 [] 3687 읽음    2000-03-15 00:00
StringGrid를 이용하여 각 셀에 들어있던 정보들을 화일에 저장하였다가 불러오는 프로그램을
짜고 있는데 4가지 파일에 저장했다가 불러오는 것입니다. 소스는 아래와 같이 하였습니다.

void __fastcall TRForm::RSave()
{
    char szFileName[MAXFILE+4];
    int iFileHandle;
    int iColCountLen;
    int iRowCountLen;
    int iLength;
    AnsiString aFileName;
    AnsiString cColNo;
    AnsiString cRowNo;
//SRB(RadioButton) 4개를 설치하여 체크된 결과에 따라 4가지 파일로 저장한다.(그룹으로 묶었음)
    if(SRB->Checked==true)
    {
        aFileName="sreg.orf";
    }
    else if(MRB->Checked==true)
    {
        aFileName="mreg.orf";
    }
    else if(LRB->Checked==true)
    {
        aFileName="lreg.orf";
    }
    else
    {
        aFileName="hreg.orf";
    }
//같은 이름의 화일은 백업해 둔다.
        if (FileExists(aFileName))
        {
            fnsplit(aFileName.c_str(), 0, 0, szFileName, 0);
            strcat(szFileName, ".OLD");
            RenameFile(aFileName, szFileName);
        }
        iFileHandle = FileCreate(aFileName);
//RSGrid는 StringGrid 임
        cColNo=IntToStr(RSGrid->ColCount);
        cRowNo=IntToStr(RSGrid->RowCount);

// 그리드의 rows 와 columns 의 수를 적는다.
        iColCountLen=cColNo.Length()+1;
        FileWrite(iFileHandle, &iColCountLen, sizeof(int));
        FileWrite(iFileHandle, cColNo.c_str(), iColCountLen);

        iRowCountLen=cRowNo.Length()+1;
        FileWrite(iFileHandle, &iRowCountLen, sizeof(int));
        FileWrite(iFileHandle, cRowNo.c_str(), iRowCountLen);


// 각 string의 길이와 스트링을 적는다.
        for (int x=0;x<RSGrid->ColCount;x++)
        {
            for (int y=0;y<RSGrid->RowCount;y++)
            {
                iLength = RSGrid->Cells[x][y].Length()+1;
                FileWrite(iFileHandle, &iLength, sizeof(int));
                FileWrite(iFileHandle, RSGrid->Cells[x][y].c_str(), iLength);
            }
        }
        FileClose(iFileHandle);
}

void __fastcall TRForm::ROpen()
{
    int iFileHandle;
    int iColCountLen;
    int iRowCountLen;
    int iLength;
    AnsiString cColNo;
    AnsiString cRowNo;
    AnsiString aFileName;

    if(SRB->Checked==true)
    {
        aFileName="sreg.orf";
    }
    else if(MRB->Checked==true)
    {
        aFileName="mreg.orf";
    }
    else if(LRB->Checked==true)
    {
        aFileName="lreg.orf";
    }
    else
    {
        aFileName="hreg.orf";
    }
        iFileHandle = FileOpen(aFileName, fmOpenRead);
//ColCount와 RowCount 수를 읽어온다.

        FileRead(iFileHandle, &iColCountLen, sizeof(int));
        FileRead(iFileHandle, cColNo.c_str(), iColCountLen);
        cColNo=(AnsiString)(cColNo.c_str());
        RSGrid->ColCount=StrToInt(cColNo);

        FileRead(iFileHandle, &iRowCountLen, sizeof(int));
        FileRead(iFileHandle, cRowNo.c_str(), iRowCountLen);
        cRowNo=(AnsiString)(cRowNo.c_str());
        RSGrid->RowCount=StrToInt(cRowNo);

//셀에 저장했던 데이터를 읽어와 보여준다.
        for (int i=0;i<RSGrid->ColCount;i++)
        {
            for (int j=0;j<RSGrid->RowCount;j++)
            {
                FileRead(iFileHandle, &iLength, sizeof(int));
                FileRead(iFileHandle, RSGrid->Cells[i][j].c_str(), iLength);
                RSGrid->Cells[i][j]=(RSGrid->Cells[i][j].c_str());
            }
        }
        FileClose(iFileHandle);
}

저장하는 버튼이 RSave()로 저장하고 라디오버튼을 체크하면 4가지중 한가지가
StringGrid에 자료를 보여주는데......
문제는 2가지 자료는 보여주는데 3번째 자료부터는(무작위로 선택해도) 에러메시지가
뜹니다.
왜 그런지 누가 가르쳐주시고 잘못된 부분좀 설명해 주셔요...
TFileStream을 이용하여 짜보다가 않되서 포기하고 API 함수로 짜보았습니다.
제발 누가 가르쳐주셔요....벌써 2주째 않되네요..

+ -

관련 글 리스트
3102 [질문]벌레좀 잡아주셔요....제발 무명씨 3687 2000/03/15
3119     Re:안시스트링에서 c_str() 사용의 오류입니다. 박지훈.임프 4049 2000/03/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.