CString 을 사용하여 파일을 읽을 때... ♬ 프로그램 이야기

CString 을 일반적으로 사용한다던지 또는 DEBUG로 사용할 때는 보통 별 문제 없이 사용이 된다.
하지만, 파일을 Read()하는 것 처럼 큰 데이터를 사용하려 할 때는 아래와 같이 정확히 원하는 만큼의 버퍼를 잡아주고, 사용이 끝나고 난 후에는 버퍼를 해제해 주어야 에러없이 잘 동작한다..
주의하자..!!!!
>>> 참고 : 윈도우 프로그래밍 플러스 : 김은철 저 <<<
LPTSTR GetBuffer(int nMinBufferLength);
--- nMinBufLength : C 형태로 사용할 최소 버퍼의 크기. 현재 CString 버퍼보다 크게 설정하면 CString 버퍼가 그 크기만큼 자동으로 재 설정되며, 작게 설정하면 CString 버퍼 크기가 그대로 유지된다. CString 버퍼를 char*로 변환하는 용도로만 사용한다면 0으로 하면되고, CString 버퍼를 직접 접근하여 문자열을 수정하려면, 최대 문자열 길이 +1 해주면 된다.
--- 반환값 : C 형태로 접근할 수 있는 CString 버퍼의 포인터
LPTSTR GetBufferSetLength(int nNewLength);
--- nNewLength : C 형태로 사용할 버퍼 크기. 현재 CString 버퍼크기보다 크게 설정하면 CString 버퍼가 그 크기만큼 자동으로 재 설정되며, 작게 설정하면 버퍼의 크기는 CString 버퍼크기가 그대로 유지되지만 문자열은 그 크기만 남고 잘려 나간다. CString 버퍼의 char*를 얻으면서 지정된 크기만큼의 문자열만 사용할 때 유용하다.
--- 반환값 : C 형태로 접근할 수 있는 CString 버퍼의 포인터
void ReleaseBuffer(int nNewLength = -1);
--- nNewLength : 보통 생략. CString 버퍼의 char*를 사용하여 문자열을 수정한 경우 현재 버퍼의 크기를 정확하게 입력해야 한다.
UINT Read(void* lpBuf, UINT nCount);
--- 개방된 파일에서 64K 미만의 텍스트 또는 바이너리를 읽을때 사용
--- 반환값 : 실제 읽혀진 바이트 수
UINT ReadHuge(void* lpBuf, UINT nCount);
--- 개방된 파일에서 64K 이상의 텍스트 또는 바이너리를 읽을때 사용
--- 반환값 : 실제 읽혀진 바이트 수
*** Read, ReadHuge는 텍스트형이나 바이너리형 모두 읽을 수 있다.
*** Read 함수를 상속 받은 클래스에서 파일을 텍스트 모드로 사용시 ("
")은 자동으로 개행문자(" ")로 변환된다
void Write(void* lpBuf, UINT nCount);
--- Read와 반대
void WriteHuge(void* lpBuf, UINT nCount);
--- ReadHuge와 반대

예1 ) GetBuffer, ReleaseBuffer
char* p;
CString str("12345");
p = str.GetBuffer(0); //str문자열 크기만큼 자동할당
....
str.ReleaseBuffer(); //사용해제

예2 ) GetBufferSetLength, ReleaseBuffer
char* p;
p = str.GetBufferSetLength(3); //3바이트 만큼 할당
...
str.ReleaseBuffer(); //사용해제

파일읽기 사용예3 )
DWORD dwLength = tesfile.GetLength();
dwLength = tesfile.ReadHuge(strOldData.GetBufferSetLength(dwLength), dwLength);
strOldData.GetBufferSetLength(dwLength);
strOldData.ReleaseBuffer();
tesfile.Close();

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://ninvu.egloos.com/tb/1913538 [도움말]

덧글

  • 축구왕드록바 2009/08/14 12:19 # 삭제 답글

    감사히 잘 보고 정리가 잘 되어 있어서 제 블로그로 퍼갑니다.
    출처 표시는 했지만 문제가 된다면 삭제하겠습니다.
    사전 양해없이 퍼간 점에 대해선 정말 죄송합니다.
덧글 입력 영역