|
무엇때문에 이런 것을 할려는지는 알 수 없으나, 메모리 데이터(숫자, 문자)를 파일로 쓰고 싶다면, 일반적으로는 바이러니 파일 형태를 이용합니다.
그리고, 서술해 주신 내용상에서 발견할 수 있는 내용중, 오류가 날 수 있겠다 싶은 부분은,
"배열은 메모리상에 연속된 공간을 할당받지만,
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 이렇게 저장합니다.
: :
: : 그럼.. 도움이 되셨길 바랍니다.
|