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
[51748] Tab 구분파일 읽는 예제입니다.
조대현.Clau [casanebula] 3303 읽음    2007-12-28 09:05
어제 집에 툴이 없는지라 테스틀 못해서 지금 올리네요ㅎㅎ

기존 소스에다 그리드 출력을 짜집기 하느라 엉망이지만 대충 보시고 이해용도로 쓰세요.

1. 파일을 통째로 읽고

2. CR+LF(줄바꿈)단위로 자릅니다. 즉, 한줄마다 AnsiString에 넣습니다.

3. 그 내용을 TStringList에 넣어서 Delimiter를 Tab(char(9))으로 구분하면 나뉘어 집니다.

4. 총 분할개수가 4개(날짜, 데이터1, 데이터2, 데이터3)일때만 데이터를 읽어 그리드에 출력합니다.
   4개일때만 읽으므로 헤더부분이나 잘못된 행은 읽지 않습니다.








//////////////////////////////////////////////////////////////

bool TForm1::LoadFromFile(AnsiString pFileName)
{
    int iFileHandle, iFileLength;
    int iRow, iBegin, iEnd;
    int iRowIndex;
    AnsiString asDateTime, asBuffer, asString;
    double dData01, dData02, dData03;
    char *cBuffer;
    TStringList *slTemp;

    iRowIndex = 1;

    if(pFileName == "")
        pFileName = "data.dat";

    try{
        // 파일 검사후 파일이 있으면 읽고 아니면 실패
        if(FileExists(pFileName)){
            // 파일이 있으므로 읽는다.
            iFileHandle = FileOpen(pFileName, fmOpenReadWrite);
            // 파일의 끝으로 이동하여 총 길이를 구한다.
            iFileLength = FileSeek(iFileHandle, 0, 2);
            // 다시 처음으로 이동한다.
            FileSeek(iFileHandle, 0, 0);
            // 버퍼를 읽을 크기만큼 초기화한다.
            cBuffer = new char[iFileLength + 1];
            // 파일에서 크기만큼 데이터를 읽고 바이트수를 저장한다.
            FileRead(iFileHandle, cBuffer, iFileLength);
            // 파일을 닫는다.
            FileClose(iFileHandle);

            // 버퍼를 cr + lf까지 읽고 ,(comma)로 구분하여 구조체에 저장한다.
            iRow = 1;
            asDateTime = "";
            dData01 = 0;
            dData02 = 0;
            dData03 = 0;
            iBegin = iRow;
            iEnd = iBegin;
            asBuffer = (AnsiString)cBuffer;
            while(iRow <= asBuffer.Length()){
                // cr과 lf를 찾는다.
                if((asBuffer[iRow] == char(13)) & (iRow + 1) <= asBuffer.Length()){
                    if(asBuffer[iRow + 1] == char(10)){
                        // cr+lf전까지 한줄을 읽는다.
                        iEnd = iRow - 1;
                        if(iBegin > 0 & iEnd > 0 & iBegin < iEnd){
                            asString = asBuffer.SubString(iBegin, iEnd - iBegin + 1);

                            // StringList에 넣은 후, comma로 구분한다.
                            slTemp = new TStringList;
                            slTemp->Clear();
                            slTemp->Delimiter = char(9);
                            slTemp->DelimitedText = asString;

                            // comma 구분시 나눠진 데이터가 4개일때만 추가한다.
                            if(slTemp->Count == 4){
                                asDateTime = slTemp->Strings[0];
                                dData01 = StrToFloat(slTemp->Strings[1]);
                                dData02 = StrToFloat(slTemp->Strings[2]);
                                dData03 = StrToFloat(slTemp->Strings[3]);

                                // Grid 출력
                                GridData->RowCount = GridData->RowCount + 1;
                                GridData->Cells[0][iRowIndex] = asDateTime;
                                GridData->Cells[1][iRowIndex] = FloatToStr(dData01);
                                GridData->Cells[2][iRowIndex] = FloatToStr(dData02);
                                GridData->Cells[3][iRowIndex] = FloatToStr(dData03);
                                iRowIndex++;
                            }

                            delete slTemp;
                            slTemp = NULL;
                        }

                        // lf는 건너뛴다.
                        iRow++;
                        // 새로운 Begin과 End를 설정한다.
                        iBegin = iRow;
                        iEnd - iBegin;
                    }
                }

                iRow++;
            }

            // 버퍼는 클리어 한다.
            delete [] cBuffer;
        }
        else{
            return false;
        }
    }
    catch(...){
        if(!iFileHandle){
            FileClose(iFileHandle);
            iFileHandle = NULL;
        }

        return false;
    }

    return true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    GridData->RowCount = 1;
    GridData->ColCount = 4;

    LoadFromFile(ExtractFilePath(Application->ExeName) + "data.dat");
}
//---------------------------------------------------------------------------

///////////////////////////////////////////////////



네버 님이 쓰신 글 :
: 알려주신데로 하는데
:  while(!feof(sfp)) {
: :           if(fgets(buffer, sizeof(buffer), sfp) == NULL) break;
: 여기에서 buffer를 설정할때 AnsiString 로하는건가요?
:
: 근데 AnsiString 로 설정하고 할 경우
: a = buffer.pos(char(9)); // 9번 ASCII코드가 TAB문자에요.
: :     RecodeTime = buffer.SubString(1, a); // 처음부터 탭문자까지 날짜로 읽음
: :     buffer = buffer.SubString(a, buffer.Length() - a); // 읽은 글자는 지웁니다.
: :
: :     b = buffer.pos(char(9));
: :     Data01 = FormatFloat("0,00", buffer.SubString(a, b)); // 첫번째 탭문자부터 다음 탭문자까지 데이터 읽음
: :     buffer = buffer.SubString(b, buffer.Length() - b); // 읽은 글자는 지웁니다.
: :
: :     c = buffer.pos(char(9));
: :     Data02 = FormatFloat("0,00", buffer.SubString(b, c));
: [C++ Error] uComm.cpp(1642): E2342 Type mismatch in parameter 'index' (wanted 'int', got 'AnsiString')
: 이러한 에러들이 발생합니다.
:
: [C++ Error] uComm.cpp(1636): E2034 Cannot convert 'AnsiString' to 'char *'
: 이런 메세지도요.
:
: 그래서  TStringList *data=new TStringList();
:  data->LoadFromFile(File_Open.c_str());
:
: 이런식으로 사용하게 되면 data->string.pos는 가능하나
:   Data01 = FormatFloat("0,00", buffer.SubString(a, b)); // 첫번째 탭문자부터 다음 탭문자까지 데이터 읽음
: 이것처럼 첫번째 탭에서 다음 탭사이의 데이타를 읽어 주는게 나타나질 않습니다.
:
: 답변 다시 한번 부탁드릴게요
:

+ -

관련 글 리스트
51737 엑셀 파일 데이타 점검시 속도 문제. 네버 1544 2007/12/27
51738     Re:엑셀 파일 데이타 점검시 속도 문제. 장성호 2070 2007/12/27
51742         Re:Re:엑셀 파일 데이타 점검시 속도 문제.- 답변 고맙습니다 - 질문하나만 더할게요 네버 2465 2007/12/27
51743             파일이 탭구분 파일인것 같네요. 탭문자로 파싱해서 사용하세요. 조대현.Clau 3122 2007/12/27
51746                 Re:고맙습니다 - 질문하나 더할게요. 네버 1743 2007/12/27
51748                     Tab 구분파일 읽는 예제입니다. 조대현.Clau 3303 2007/12/28
51759                         Re:고맙습니다^^ 근데 에러가.. 네버 1378 2007/12/28
51766                             흠~ 빌드해서 작동하는거 보고 올린소스인데~ㅎ 조대현.Clau 1084 2007/12/29
51774                                 Re:흠~ 빌드해서 작동하는거 보고 올린소스인데~ㅎ 네버 1179 2008/01/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.