|
제가 test.txt 파일을 읽어보니 "가|나|다|?? " 이렇게 되어 있네요???? 즉 첫번째 정수만 쓰기가 된 것 같아요.
일단 코멘트 하고 싶은 것은 4 바이트 정수의 각 바이트를 직접 파일에 쓰는 것은 좋지 않습니다. 즉 ASCII 값이 써진다는 것인데 안전한 ASCII 값의 범위는 매우 적습니다. 예를들어 0 ~ 9, A ~ Z, a ~ z 이런 식이죠. 즉 null 같은 값이 써지기라도 한다면 정확히 동작하지 않을 겁니다.
그러므로 Hex 값으로 쓰는 것을 추천합니다. str.sprintf("%04X", 123456789); 이런 식이면 될겁니다.
음..
cut_int 함수를 쓰지 마시고, cut_string 함수에서 정수부분에 해당하는 문자열, 즉 123456789 이면 "75BCD15" 가 되겠죠, 을 scanf("%x", &value) 로 읽으면 간단합니다.
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 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
:
: 이렇게 나누고싶은데 방법이 없을까요
|