시스템 콜을 사용해 fwrite를 구현하려고 합니다.
글쓴이: atomes / 작성시간: 수, 2011/11/02 - 4:14오전
fwrite 함수를 시스템콜을 사용해서 구현하려고 합니다.
임시버퍼의 크기를 64,파일버퍼의 크기를 1000이라고 선언하면
1) 파일에 저장할 배열의 원소를 임시버퍼 크기만큼(0~63) 가져와 임시버퍼에 넣는다
2) 임시버퍼가 꽉 차면 파일버퍼에 임시버퍼의 내용을 쓰고 임시버퍼를 비운다
3) 1)의 배열의 다음 위치부터 시작해서 원소를 임시버퍼 크기만큼(64~127) 가져와 임시버퍼에 넣는다
4) 임시버퍼가 꽉 차면 파일버퍼에 임시버퍼의 내용을 이어서 쓰고 다시 임시버퍼를 버퍼를 비운다
5) 위와 같은 과정을 반복해서 배열의 모든 원소가 파일버퍼에 들어가거나 파일버퍼가 꽉 차면
write함수를 이용해 파일에 파일버퍼의 내용을 쓴다
임의로 만든 파일 구조체 _FILE은 다음과 같습니다.
typedef struct __FILE { int fd; //파일식별자 char* pBuf; //파일의 버퍼 int allocBytes; //기록할 자료의 양 } _FILE;
다음은 구현하려는 _fwrite 입니다.
#typedef MAX_BUF_SIZE 64 #typedef FILE_BUF_SIZE 1000 size_t _fwrite( void *ptr, size_t size, size_t nitems, _FILE *stream) { int writereturn = 0; int i = 0; int j = 0; int k = 0; char buf[MAX_BUF_SIZE]; while(ptr[j]!='\0') { while(i != MAX_BUF_SIZE-1) { buf[i] = (char*)ptr[j]; i++; j++; } i = 0; while(k != j) { stream->pBuf[k] = buf[i]; i++; k++; } } writereturn = write(fd, stream->pBuf, nmemb); return writereturn; }
컴파일시 오류가 나는데 void 포인터가 문제인 것 같습니다.
void 포인터의 어떤 부분에서 틀린건지 잘 모르겠네요.. 도통 감을 못잡겠습니다.
고쳐야 할 부분 지적해주시면 감사하겠습니다
Forums:
void *ptr 를 char * 로 casting 해주세요.
error message 를 함께 찍어주시면 더 좋을텐데요.. ㅎㅎ
감사합니다 void포인터는 어떠한 타입이여도
감사합니다
void포인터는 어떠한 타입이여도 상관없다는 소리를 들어서
일부러 캐스팅하지 않았는데 역시 캐스팅이 필요한가 보네요;;
while(ptr[j]!='\0')
while(ptr[j]!='\0')
부분에서 ptr은 type이 void*이니 ptr[i]로 접근할 수 없을 것 같네요 ㅎ
보이드 포인터 접근하실 때 이런식으로 접근하시면 문제
보이드 포인터 접근하실 때 이런식으로 접근하시면 문제 없을 꺼 같습니다.
((char *)void_ptr)[i]
(char *)void_ptr[i] // 이렇게 하면, 우측 결합이 우선시 되기 대문에 void *로 연산하게 됩니다.
댓글 달기