|
파일을 읽어 데이터를 처리하는 과정에서 궁금한것이 있습니다.
----------------------------------------------------------------
파일구조
[문자열|문자열|문자열|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 cut_int(unsigned char * str)
{
int value;
memcpy(&value,str,4); <- 4byte를 잘라 int로 값치환 ********** 쓰레기가값 발생부분
strcpy(str, str+4); <- str 버퍼에서 읽은 부분(4byte)은 잘라내고 다음으로 시작포인터를 옮김
return value;
}
void load_values()
{
unsigned char * buffer;
//test.txt 파일에서 읽어 버퍼에 넣음
Edit1->Text = cut_string(buffer);
Edit2->Text = cut_string(buffer);
Edit3->Text = cut_string(buffer);
Edit4->Text = IntToStr(cut_int(buffer));
Edit5->Text = IntToStr(cut_int(buffer));
}
----------------------------------------------------------------------------
**** 문제는 4바이트 정수를 읽어서 int로 바꾸는건데 요부분이 잘 안됩니다.
문자열의 길이를 알아서 그 만큼 건너뛰고 fread()를 하면 별문제가 없습니다.
문자열의 길이는 가변적입니다. 그러나 [|] 를 구분자로 사용하였고 연산을 하기위해 파일을 읽어 str 변수에담아 처리하려고 하는데 이상한 쓰레기값이 결과가 나옵니다.
요점정리 : 문자열길이가 유동적이라 파일에서 직접 읽지않고 함수에서 str 변수에 파일을 전부 읽어들여서 버퍼에서 잘라 사용하고자 하는데 위의방법으로는 작동이 안됩니다.
문제가 무엇인지요.. 텍스트파일을 만들어 첨부했습니다.
가
나
다
123456789
666
이렇게 나누고싶은데 방법이 없을까요
|