'MFC Controls'에 해당되는 글 1건

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Visual C++ 2008의 파일읽기 버그

졸업프로젝트를 하다 이상한 현상을 목격했습니다.

이 현상 덕분에 4시간동안 아무것도 못했으니 어떻게 보면 실로 엄청난 문제같은데..

누군가에게 도움이 되고자 이렇게 만듭니다.

 

흔히 MFC 에서 파일을 읽어들일 때, CFile 을 사용합니다.

 

CFile::Read() 라는 함수를 보면 파일에 있는 내용을 읽어들이는 버퍼로 LPVOID 형 변수를 사용하는데요 보통 char 형 포인터를 캐스팅해서 사용합니다.

 

TCHAR Cost2[512];

file.Read((LPVOID)Cost2, 512);

 

MFC 에서 문자열을 위한 CString 클래스를 제공하는데 이를 사용하기 위해선

 

CString Cost2;

file.Read((LPVOID)(LPCTSTR)Cost2, file.GetLength());

 

이렇게 해줍니다. 문제는 여기서 발생합니다. CString 2개이상 선언(클래스 내부 혹은 구조체 내부 건 위치는 상관 없습니다.)해서 이를 이용해 파일 내용을 읽어들이면

사용자 삽입 이미지

위와 같은 내용을 가진 변수들이
사용자 삽입 이미지

 

이렇게 바뀝니다이런

문제는 이것 뿐만이 아닙니다.

사용자 삽입 이미지

컨트롤에 있는 변수(내용이 비어있을 것이라고 추정)는 죄다 해당 내용으로 바뀝니다. 위의 변수는 VS 2008 Feature Pack 에서 지원되는 그리드 클래스안의 변수입니다. 저렇게 되어있는 변수를 윈도우 클래스에 붙여주게 되면 당연히런타임 에러가 발생합니다.

따라서, CFile:Open 안의 데이터 내용을 문자열로 읽어들이려면

1.     TCHAR 를 사용한다.

2.     CString 을 사용하고 싶거든 실행되는 모든 객체에 대해서 파일을 읽어들인 후 일일히 초기화를 시켜줘라..(확인된 방법은 아님, 실제로 해보다가 지쳐서포기)

를 해주는게 추후 정신건강에 좋다고 생각됩니다.

2008 6 15일 박지훈씨의 의견에 의한 내용 추가

CString 의 선언 후 Debug를 통해 포인터를 조사해 보았습니다. 그 결과

사용자 삽입 이미지

CString 으로 선언된 두 변수 aa, bb 가 같은곳을 가리키고 있음을 확인할 수 있습니다.

따라서, 생각해보건데 CString 은 대입 연산이 일어날 때, 메모리를 새로 할당받아서 사용함을 생각할 수 있습니다.

 

'프로그래밍 > MFC&API' 카테고리의 다른 글

Windows Via C/C++  (0) 2008.05.21
MFC RTTI (CRuntimClass)  (2) 2008.05.20
블로그 이미지

캡틴토마스

그저 걷고 있는거지...

,