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
[22814] Re:Re:Re:Re:[질문] 자문자답..
김진영 [] 922 읽음    2002-11-24 00:42
안녕하세요?
여러분께서 답변 주셨는데 당혹스럽게도 그냥 제 실수 였습니다.
제가 사용한 방법은 맞았습니다.
그것 때문에 문제가 생긴것이 아니라 STL을 사용하면서 문제가 생겼더군요.
파일->문자 배열->string->string,정수로 분리후 처리->문자 배열->파일
이런식으로 처리했는데
문자 배열에서 string으로 복사할때 STL의 copy()함수를 이용했는데 이게 문제더군요.
일반 문자배열 "abcde"이런 배열은 잘 복사되는데 "))"이런 배열은 복사하니 문제가
발생했습니다.
물론 후자의 배열은 정수를 문자열로 저장한 것입니다.
그래서 문자배열에서 string으로 복사후 처리하지 않고 string과 정수를 포함하는 구조체를
만들고 문자배열에서 구조체로 복사후 처리하니 잘되었습니다.
STL의 string이나 vector<char>에는 정수를 문자열로 바꾼것은 저장하면 안되는 모양입니다.
좀더 체계적으로 공부를 해야겠군요.ㅠ.ㅠ
혹시 이런 경우를 당하신분들께 도움이 되었으면 합니다.
나만 그런가... -.-a
그럼 이만...


하느리 님이 쓰신 글 :
: 무엇때문에 이런 것을 할려는지는 알 수 없으나, 메모리 데이터(숫자, 문자)를 파일로 쓰고 싶다면, 일반적으로는 바이러니 파일 형태를 이용합니다.
: 그리고, 서술해 주신 내용상에서 발견할 수 있는 내용중, 오류가 날 수 있겠다 싶은 부분은,
:
: "배열은 메모리상에 연속된 공간을 할당받지만,
: new 등의 메모리 할당 연산자를 이용하여 여러번 메모리를 할당할 경우 연속된 메모리 공간을 확보할 수 없다. 따라서 메모리할당시의 크기보다 더 큰 크기를 읽을 경우 비정상적인 데이터를 읽게 된다. (한번의 new 연산자를 이용할 경우는 당연히 연속적인 메모리 공간을 할당 받음)"
:
: 이 점이 간과되어진 것은 아닌지 모르겠네요.
: 보다 분명한 것은 소스코드를 올리시면 금방 해결될 거 같네요.
: -_______________-a
:
:
:
: 김진영 님이 쓰신 글 :
: : 안녕하세요?
: : 관심을 가져 주셔서 감사합니다.
: : 하지만 유감스럽게도 제가 구하는 답이 아니네요.
: : 님이 사용하시는 방법은 아스키코드의 49(0x30)가 숫자 1을 나타낸다는 점을 이용하여
: : 숫자+48을하면 원하는 숫자의 아스키 코드를 구하여 char로 저장하는 방법입니다.
: : 그럼 이렇게 했을때 10이상의 숫자는 어떻게 저장을 할 수 있을까요?
: : char가 2개(2byte)가 필요하죠.
: : 만약 10000이라면 5바이트가 필요합니다.
: : 실제 char가 표현가능한수가 256개인데 그중 겨우 10개만 사용합니다.(0~9);
: : 상당히 메모리의 낭비입니다.
: :
: : 그래서 short int를 char[2]에 저장하는 방법을 이용하려 합니다.
: : *((short *)char_ary) = int_value
: : 위의 표현은 int 배열이든 char배열이든 메모리상에서는 똑같이 저장된다는 점을 이용한 것입니다.
: : 포인터의 다음 위치를 계산할 때만 차이가 있습니다.
: : int는 4바이트(32비트 운영체제), char는 1바이트씩 포인터를 증감시키죠.
: : 포인터를 사용하실수 있다면 무슨 뜻인지 알수 있을것 같습니다.
: : 이렇게 하고 문자배열을 출력해보면 입력한 숫자에 따라 해당아스키코드가 다 나옵니다.
: : 물론 2개의 char가 1개의 short int를 의미하죠.
: : 나중에 복원하여 사용합니다.
: :
: : 이런식으로 메모리의 낭비없이 정수를 문자열로 저장하고 싶습니다.
: : 그런데 제가 사용한 방식으로 파일에 저장하면 문자열의 길이가 다르게 저장됩니다.
: : 항상 10바이트 되어야하는데 어떤 것은 더 크기도 하고 더작게도 됩니다.
: : 그러니 읽을때 10바이트씩 읽으면 엉뚱한 데이터를 읽게 됩니다.
: :
: : 그래서 "메모리의 낭비없이 항상 일정한 길이를 가지게 정수를 문자열로 저장하고 싶다"는 것이 제가 궁금한 점입니다.
: : 혹시 아시면 다시 답변을 부탁드립니다.
: : 다시한번 답변에 감사드립니다.
: : 그럼 이만...
: :
: :
: : 권기식 님이 쓰신 글 :
: : : 질문이 이해가 잘 안됩니다만...
: : : 저도 잘 모르지만 아는대로만 적어보겠습니다.
: : :
: : : 단순히 1, 2, 3, 4, 5라는 숫자들을 "12345"라는 문자열로 만들고 싶으신거라면...
: : : 배열보다 하나 큰 char 배열을 생성하고...
: : : 정수에다가 0x30을 더해서 char 배열에 넣어주면 될 것 같은데요...
: : :
: : : char str[6];
: : : short int int_ary[5]={1,2,3,4,5};
: : : for(int i = 0; i < 5; i++)
: : : {
: : :     str[i] = 0x30 + int_ary[i];
: : : }
: : : str[5] = '\0';
: : :
: : : 이렇게 하면 되지 않을까요?
: : : 님처럼 하시면 16진수로 표현했을 때 각 문자 배열에 0 1 0 2 0 3 0 4 0 5 가 저장되는데...
: : : 붙여 쓰면 01 02 03 04 05 처럼되는데...
: : : 이런 포맷을 Unpacked BCD라고 하지요...
: : : Packed BCD는 12 34 50 이렇게 저장합니다.
: : :
: : : 그럼.. 도움이 되셨길 바랍니다.

+ -

관련 글 리스트
22775 [질문] 정수를 문자열에 저장하기 김진영 953 2002/11/22
22799     Re:[질문] 정수를 문자열에 저장하기 Julien 1147 2002/11/23
22789     Re:[질문] 정수를 문자열에 저장하기 권기식 829 2002/11/22
22798         Re:Re:[질문] 제가 알고 싶은것을 다시 설명드리면... 김진영 970 2002/11/23
22802             Re:Re:Re:[질문] 제가 알고 싶은것을 다시 설명드리면... 하느리 857 2002/11/23
22814                 Re:Re:Re:Re:[질문] 자문자답.. 김진영 922 2002/11/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.