태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

일반 C를 사용하여 Token을 하는 경우에는 그냥 strtok를 보통 사용하였습니다.

그러나 C++을 사용하게 될 때 구현하기 귀찮(?)아서 기존의 C 라이브러리 함수를 이용하게 되는데, 개인적으로

가장 자주 사용하는것이 strtok와 atoi입니다.

비주얼 스튜디오 2005 이후에서는 strtok를 이용하면 경고를 출력해줍니다.

이를 무시하고 코딩을 하는 경우가 많았는데........이를 무시하면 정말..무시무시한 디버깅의 세계로 빠져들 수 있으니 항상 조심하셔야합니다.


결론부터 말씀드리자면..strtok 함수는 비주얼 스튜디오 6.0 에서는 정상 작동하나, 그 이후 버전에서는

실행은 되지만 뒤에 쓰레기 값이 박히는 경우가 종종 발생합니다.

이를 대체하기 위해서 strtok_s를 이용하게 됩니다. 사용법은 아래 링크를 타고 가시면 됩니다.

출처 : http://harmonize84.tistory.com/112 

그런데 여기서 한가지 더 문제..strtok_s를 윈도우에서만 존재하는 함수라는 것입니다..

즉, 리눅스에서 같은 소스를 실행하면 에러가 난다는 것입니다.(물론 g++ 컴파일러 사용..)

그래서 다시 strtok로 변경하게 되면..쓰레기 값은 출력되지 않으나..자세히 보면 정상적인 출력이 아닌 경우가 발생합니다.

그래서 여기서 해결 방법은 strtok_r을 이용하는것입니다.

사용법은 man 페이지를 참고하세요 ~_~)~

뭐 설정이야 다른 블로그에서 많이 찾아볼 수 있으니 생략하겠습니다.

일정관리 프로그램을 하나 만들어볼까 하고 있는데 대략적으로 어떻게 프로그램이 돌아가는지 확인차 이것저것

만저보고 있습니다.

그러던 중..텍스트 박스에 입력을 할 수 없더군요..

저는 입력 도구는 항상 뜨는 줄 알았습니다.

이 때 도구 상자에서 "InputPanel"이라는 걸 사용해야 합니다.

그리고 InputPanel의 속성에 들어가서 Enable을 "True"로 설정해주시면 기존에 사용하던 입력 도구를 그대로

사용할 수 있습니다.

HTC 터치 다이아쓰고 있는데..최종적으로 언제 일정관리프로그램이 만들어질지는 모르겠네요.

만들어진다면..무료배포 고고씽..훗 *-_-*

일단 소스부터 보시겠습니다.
=====================================================================================
string load_memory(ifstream &infile)
{
        char *buff;
        int size;
        string dest;
 
        infile.seekg(0,ios::end);

        size = infile.tellg();

        infile.seekg(0,ios::beg);

        buff = new char[size];
        //memset(buff,0,size);
        infile.read(buff,size);
        cout<<buff<<endl;
 
        return dest;
}
====================================================================================
윈도우 VS2005에서 작성되었습니다.

infile을 인자로하여 열린파일의 내용을 메모리에 Load하는 함수입니다.

파일의 사이즈를 구하고 동적할당해서 메모리를 잡은다음에 파일의 크기만큼(즉, 전체를) 읽어오는 내용입니다.

이렇게 한 뒤에 buff를 출력해보면 파일의 내용이 전부다 출력되고 그 뒤에 이어서 한자와 같은 쓰레기 값이 출력이 됩니다.

이런 한자같은 쓰레기 값들은 보통 내용이 없는 메모리에 접근하였을 때 나타나는 증상입니다.

이럴 때는 '\0'값을 의심해봐야합니다.

그래서 저도 '\0'값을 열심히 찍어봤는데 원인을 찾지 못했습니다.

그래서 리눅스에서 저 소스 그대로 실행해봤더니 잘 돌아가더군요.

아무래도 운영체제나 컴파일러에 영향을 받는듯 보였습니다.

반드시 원인을 찾아내야 속이 시원한 제 성격상..리눅스에서 작업을 계속할수만은 없는 노릇입니다.

그래서 열심히 삽질을 했지만 이유를 찾지 못했죠.

그때 선배님의 조언으로 인해서(역시 경험이 풍부한 분들은 이런일도 먼저 겪어보신 경우가 많더군요)

memset 함수를 사용하여 초기화 시킨후에 하면 된다는 것을 알아냈습니다.

솔직히 파일 뒷부분에 쓰레기 값이 참조되는 이유와는 큰 상관은 없지만 그래도 이런식으로 하면

에러가 처리되니 괜찮은 방법인 것 같습니다.

아직도 이해가 안되는 것은...

왜 리눅스에서는 되고 윈도우에서는 안되는 것일까요.......어디 아시는분 없으신가요 ㅠ_ㅠ

버클리디비가 RSS에서 검색이 되지 않아서 -_-)   (펌글로 오해 하는 바람에 막아놨음 -_-);;;; )

본의 아니게 많은 사람들에게 유용한 정보를 제공하기 위해서 같은 블로그에다가

링크를 달게 되었습니다 -_-);


버클리디비 사용기 - http://shine-ing.tistory.com/8
버클리디비 사용법 - http://shine-ing.tistory.com/7

버클리디비 윈도우 버전을 다운 받은 후에 설치를 마무리 짓는다.


이제부터 허우적거리기 시작해야 한다.-_-;;


필자는 이거 알아내는데 (일단 간단한 테스트만 해보았지만) 4일 걸렸다.


솔직히 리눅스로 작업을 다 끝내놓은 상태였는데 굳이 윈도우로 할 필요는 없었다.


하지만 나도 모르게 오기가 발동해서 결국 알아버렸다........


사용하는 법을 알아보자


환경

Windows XP SP2 (x86)

Visual Studio 2005(.cpp)


사용순서

1. 일단 자신의 컴퓨터에서 버클리 DB가 설치된 경로에서 bulild_windows를 찾는다. 그 후에 "Berkeley_DB" 라는 워크 스페이스를 찾아서 더블 클릭한다. 이때 확인 창이 뜨는데 "모두 예"를 눌러주자

Berkeley_DB Workspace를 더블클릭

Yes to all 클릭


2. 이제 빌드를 해야 하는데 빌드를 하기 전에 해야 할 일이 있다. 여기가 중요한 부분이니 잘 따라하길 바란다.

좌측의 솔루션 탐색기에서 build_all 위에 있는 "솔루션 'Berkeley_DB'"를 한번 클릭한다.(선택을 하는 것임)

그 다음에 위의 메뉴에서 "프로젝트 -> 속성"을 클릭

좌측의 트리메뉴에서 "구성속성"클릭

그럼 상단에 "구성(C) : " 이라고 있고 그 오른쪽에는 "플랫폼(P)" 라고 있을 것이다.

이 부분을 "Release x86" 으로 바꿔줘야 한다. 그러기 위해서는 오른쪽에 있는 "구성 관리자"를 누른다.

상당의 활성 솔루션 구성을"Release x86"으로 바꿔준다.

속성 페이지의 변경사항을 저장하겠습니까? 라는 창이 뜬다 예 를 눌러준다.

닫기

확인

이제 좌측 솔루션 탐색기에서 build_all을 우클릭 하여서 빌드를 실행한다.


시간이 좀 걸릴것이다.  에러도 많이 뜰 것이다. 개의치 말아라~ 원래 그런건가 보다 -_-;;;


자 이제 visual studio2005 창을 끄고


빌드가 잘 실행 되었는지 확인해 보자.


아까 설치된 build_windows의 폴더안에

Realease 라는 폴더가 생성되었다면 성공한것이다.


거기서 *.lib 파일을 눈여겨 보아 두어라.


잠깐!! 이제 곧 소스를 공개해서 실행을 해 볼텐데 그 전에 주의 사항이 있다.


헤더파일에 #include <db.h> #include <db_cxx.h> 가 포함되어야 한다.

그렇기 때문에 헤더파일 경로를 지정해 주어야 하는데 이 부분을 다들 알아서 할거 라고 믿는다.


모르시는 분은 댓글로 남겨 주는 센스!!


이제 첨부한 소스를 살펴보자.



#include <db.h>

#include <db_cxx.h>

#include <iostream>

#include <string>

#include <cstdlib>

#include <cstdio>

using namespace std;

int main()

{

DB *dbp;

DBT key,data;

//dp->db_create(&dp,NULL,0);

const char *name = "TEST.DB"

char buff1[20];

int isOK,cnt;

printf("<<<<<<<<<<< Start of Berkeley DB >>>>>>>>>>>>>>>> ");

if((isOK = db_create(&dbp,NULL,0)) != 0 )

{

printf("Can`t Create DB ");

return -1;

}

cnt = 10;

if((isOK = dbp->open(dbp,NULL,"TEST.DB",NULL,DB_BTREE,DB_CREATE,0)) != 0)

{

printf("Can`t Open DB ");

return -1;

}

cin>>buff1;

key.flags = 1;

key.data = (char*)buff1;

key.size = strlen(buff1);

cout<<"key`s data : "<<(char*)key.data<<endl<<"key`s size : "<<key.size<<endl;

memset(&data,0,sizeof(DBT));

if(dbp->get(dbp,NULL,&key,&data,0) < 0)

{

cout<<"Can`t Find "<<buff1<<endl;

data.data = (unsigned int*)&cnt;

data.size = sizeof(unsigned int);

dbp->put(dbp,NULL,&key,&data,0);

}

else

cout<<"founded "<<buff1<<endl;

cout<<"!"<<endl;

dbp->close(dbp,0);

return 0;

}



긁어 넣어서 직접 정렬해서 보기 바란다.


컴파일후 실행 ㄱㄱ


안될것이다 -_-;;;;;;; 필자는 여기서 캐삽질을 했다......


그 이유는 아까 눈여겨 보았던 *.lib 파일의 부재 때문이다.


좌측 솔루션 창에서 오른쪽 마우스 버튼을 누른후에 "추가"버튼을 누른다.


그 후에 기존항목을 선택.


파일 선택창이 뜨는데 이제 여기서

확장자명 혹은 파일 종류 선택하는 곳에서 "모든파일"을 선택한다.

아까 Release로 들어간다.

이 폴더 안에 있는 .lib 파일 중에서 libdb_small46s.lib 를 선택한후에 추가한다.


이제 컴파일을 해보면 잘 된다.


혹시 개 중에 한되는 사람이 있으면 다른 .lib 파일들을 첨부해서 해보기를 바란다.


소스에 대한 자세한 사항들은 api 문서에서 찾을 수 있을 것이다.


* 혹시 DBT key에서 key.flag 를 어떻게 해줘야 하는 건지 아시는 분들은 저에게 좀 알려주세요.. 저는 그냥 1로 해놨는데

잘 되더군요 -_-);;; 자세한 설명 부탁드립니다.

================================================================================================
Release안에서 위에서 언급한 .lib를 못찾는 경우가 발생하네요.. 저 같은 경우에도 포맷하고 다시 빌드를 했더니 안되네요 -_-);; 혹시 안되시는분 있으시면 릴리즈가 아닌 디버그 x86으로 한번 시도해 보시길 바랍니다.