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
[24826] Re:Re:Re: 답변 감사합니다. 그런데 또 질문입니다.
둘리 [dooly386] 905 읽음    2003-03-20 23:05
단순히 text파일을 memo에 출력할경우는요..
Memo1->Lines->LoadFromFile(filename);

이렇게 하시면 memo component가 읽어 들입니다.
궂이 stream 으로 하지 않으셔도 됩니다.

또한 참고적으로 stream 에 대해서는요..
stream은 해당 파일을 열거나 했을때 파일의 길이를 알기 위하여 Seek등을 사용하실
필요는 없습니다.
stream의 property를 이용하심 됩니다.

stream의 길이는
TFileStream *fs = new TFileStream(....);

int filelength = fs->Size;
이고요..
가령 file position을 가장 앞에 놓고 싶으면
fs->Position = 0;
이렇게 하시면 됩니다.

TStream 의 help를 보시고 property들을 하나하나 살펴 보세요.

그리고 아래의 소스에는 문제가 있는게요.

:     for(i=0;i<=filelen;i++){
:         ReadSet->Seek(i,soFromBeginning);
:         ReadSet->Read(&Buf,1); <-- 이부분이 문제군요.
:         }

1 byte씩 읽으실려고 하는건데요.
Buf 의 위치가 문제입니다.

ReadSet->Read(Buf+i,1); <<- 이렇게 바꾸세요..

Buf 는 배열로 선언 되어 있기 때문에 Buf자체가 어드래스 입니다.(Call by reference에서
reference입니다)
그러므로 &Buf라고 하심 않됩니다.

또한 Buf 가 2000 byte인데.. 이경우 파일의 크리가 2000byte보다 크면 error 가 나겠군요.

간략하게 이렇게 해보세요.

TFileStream *fs = new TFileStream(OpenDialog1->FileName,fmOpenRead);
Memo1->Lines->LoadFromStream(fs);
delete fs;

위의 내용으로 파일이 memo에 읽힙니다.

단 Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
하시면 더 간단하겠죠..







강영준 님이 쓰신 글 :
: Setting.txt 라는 파일에 텍스트로
: K000;
: K001;
:
: 라고 되어 있을경우.
:
: TFileStream *ReadSet = new TFileStream(OpenDialog1->FileName,fmOpenRead);
:    char Buf[2000];
:    AnsiString Buf1[200];
:    AnsiString temp;
:    int filelen;
:    int i;
:
:
:     filelen = ReadSet->Seek(0,soFromEnd);
:
:     for(i=0;i<=filelen;i++){
:         ReadSet->Seek(i,soFromBeginning);
:         ReadSet->Read(&Buf,1);
:         }
:
:     Memo1->Lines->Add(filelen);
:
:     for(i=0;i<=filelen;i++)
:     Memo1->Lines->Add(temp.sprintf("%c",Buf[i]));
:
:
:    delete ReadSet;
:
: 이렇게 코딩을 했는데요.. 메모에 출력되는 글자들이 전혀 상관없는 쓰레기 값들이 출력됩니다.
:
: 파일 구조에 대해서 알수 없을까요?.. 파일이 바이너리코드로 저장 되어 있는것들은 메모장에서 읽을경우 내용을 알수 없잖아요.. 근데.. 텍스트 파일도 filestream으로 읽을경우 바이너리 코드로 읽히는건가요?...
:
: 파일 처리를 어떻게 해야 될지 모르겠네요.. 둘리님 좀 갈차 주세요..
:
:
: 둘리 님이 쓰신 글 :
: : 가령
: :
: : abcdef
: : 가나다라마바사
: :
: :
: : 라는 텍스트 파일을 만든다 생각하면
: :
: : TStringList *strs = new TStringList;
: : strs->Add("abcdef");
: : strs->Add("가나다라마바사");
: : strs->SaveToFile(".\\Setup.txt");
: : delete strs;
: :
: : 이렇게 하시고요
: : 읽을경우
: : strs->LoadFromFile(filename); 을 사용하세요.
: :
: : 혹 TFileStream을 사용하실경우
: : fmOpenRead는 반드시 파일이 있는지를 검사하시고 사용하세요.
: : 파일이 없으면 에러 뜹니다.
: : if(FileExists(filename)) ReadSet = new TFileStream(....);
: :        else 파일 없음 처리..
: :
: : 또한 Write로 Open 할경우는 fmOpenWrite를 사용하셔야 되는데요..
: : 이경우 파일이 있을경우는 fmOpenWrite를 사용하시고요
: : 새로 저장할 파일이 신규 파일일 경우는 fmCreate로 하셔야 합니다.
: :
: : 또한 fmOpenWrite전에 기존 파일이 있을경우 해당 파일의 write 속성을 보셔야되요.
: : 가령 해당 파일이 read only로 설정된 경우 에러 납니다.
: :
: : ^^
: :
: :
: : 강영준 님이 쓰신 글 :
: : : 외부에서 파일을 읽어서 버퍼에 저장한다음 자료를 처리한후
: : :
: : : 다시 같은 이름의 파일로 저장 할려고 합니다.
: : :
: : : 환경설정파일 같은걸 말하는겁니다.
: : :
: : : TFileStream 을 사용하는걸로 아는데..
: : :
: : : TFileStream *ReadSet = new TFileStream(".\\Setup.txt",fmOpenRead);
: : :
: : : 이러구 나서 .. 버퍼에 저장을 해서 처리를 해야 될거 같은데..
: : :
: : : 모르겠네요..
: : :
: : : 저장 하는 방법도 알려주세요.
: : :
: : : 그리고 바이너리 파일로 저장 하게 되면 일반 에디트프로그램으로 내용을 확인 할수 없잖아요..
: : :
: : : 그건 어떻게 하는건지?
: : :
: : : 계속 질문만 올립니다...

+ -

관련 글 리스트
24786 외부파일 읽고 쓰기 어떻게 하는건가요? 강영준 759 2003/03/19
32095     Re:외부파일 읽고 쓰기 어떻게 하는건가요? Emmortal.초짜 772 2003/03/19
24797     Re:외부파일 읽고 쓰기 어떻게 하는건가요? 둘리 1044 2003/03/20
24805         Re:Re: 답변 감사합니다. 그런데 또 질문입니다. 강영준 869 2003/03/20
24826             Re:Re:Re: 답변 감사합니다. 그런데 또 질문입니다. 둘리 905 2003/03/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.