|
문득 지나치다, 질문이 가지런한게 마음에 들어 글을 남깁니다.
우선,
파일 저장부분에서 눈에 띄는 부분을 짚어드리죠.
저장은 문제 없다고 하셨지만 다소 먼 길을 돌아가시는듯 합니다.
AnsiString temp = Edit1->Text + "|" + Memo1->Text + "|" + Memo2->Text + "|";
fwrite(temp.c_str(), temp.Length(), 1, in);
이면 문자열 저장이 끝날테고,
int temp = 123456789;
fwrite(&temp, sizeof(int), 1, in);
처럼 하면 memcpy 없이도 단순히 주소 연산자를 이용해 저장할 수 있습니다.
파일구조에는 [문자열|문자열|문자열|4바이트정수|4바이트정수]
이라 하셨지만, 뒤의 정수와 정수부 사이엔 파이프 문자(|) 가 보이지 않는군요.
어차피 고정길이 부분이니 이부분은 굳이 파이프가 필요없기도 하겠죠.
다음,
파일의 로딩부에서
int value;
unsigned char * str; // 현재 숫자가 시작하는 부분의 버퍼주소를 가리키고 있다고 생각합시다.
memcpy(&value,str,4); // 여기까진 말이 됩니다.
strcpy(str, str+4); 이건 말이 안되네요.
strcpy는 NULL문자를 만날때 까지 복사합니다.
이 부분이 memcpy(value2, str + 4, 4) 였다면 말이 되겠지요.
어쨌든 이 부분도
실은 이렇게 해 버리면 그만이었던 겁니다.
value = *(int *)str;
value2 = *(int *)(str + sizeof(int));
intothefree 님이 쓰신 글 :
: 파일을 읽어 데이터를 처리하는 과정에서 궁금한것이 있습니다.
:
: ----------------------------------------------------------------
: 파일구조
: [문자열|문자열|문자열|4바이트정수|4바이트정수]
: ----------------------------------------------------------------
: 데이터저장부
: str.sprintf("%s|","가");
: fwrite(str.c_str(),Edit1->Text.Length()+1,1,in); // 문자열1
:
: str.sprintf("%s|","나");
: fwrite(str.c_str(),Memo1->Text.Length()+1,1,in); // 문자열2
:
: str.sprintf("%s|","다");
: fwrite(str.c_str(),Memo2->Text.Length()+1,1,in); // 문자열3
:
: tmp = 123456789;
: memcpy(strtemp,&tmp,4);
: fwrite(strtemp,sizeof(int),1,in); // 정수1
:
: tmp = 666;
: memcpy(strtemp2,&tmp,4);
: fwrite(strtemp2,sizeof(int),1,in); // 정수2
:
: 파일크기 17바이트 정상
: ----------------------------------------------------------------------------
: 데이터로딩부
:
: 문자열자르는 함수
: 스트링은 잘됩니다. |를 만날때까지 읽다가 |를 만나면 문자열로 바꾸어 저장하고 포인터를 증가시켰습니다.
:
: 문제의 정수자르는 함수부분
: int value;
: unsigned char * str : 함수 파라미터로 파일을 읽은 버퍼입니다.
:
: memcpy(&value,str,4);
: strcpy(str, str+4);
: ----------------------------------------------------------------------------
:
: **** 문제는 4바이트 정수를 읽어서 int로 바꾸는건데 요부분이 잘 안됩니다.
:
: 문자열의 길이를 알아서 그 만큼 건너뛰고 fread()를 하면 별문제가 없습니다.
: 문자열의 길이는 가변적입니다. 그러나 [|] 를 구분자로 사용하였고 연산을 하기위해 파일을 읽어 str 변수에담아 처리하려고 하는데 이상한 쓰레기값이 결과가 나옵니다.
:
: 요점정리 : 문자열길이가 유동적이라 파일에서 직접 읽지않고 함수에서 str 변수에 파일을 전부 읽어들여서 버퍼에서 잘라 사용하고자 하는데 위의방법으로는 작동이 안됩니다.
:
: 문제가 무엇인지요.. 텍스트파일을 만들어 첨부했습니다.
:
: 가
: 나
: 다
: 123456789
: 666
:
: 이렇게 나누고싶은데 방법이 없을까요
|