안녕하세요. 파일 offset관련 질문입니다.
글쓴이: bluesaiha / 작성시간: 수, 2011/09/28 - 9:00오후
저수준의 FILE I/O를 이용해서 고수준의 FILE I/O를 구현하는 것이 목적인데요
파일 디스크립터와 파일 포인터를 쓴다는 두 I/O간의 차이를 알아내고 fileno()함수를 통해서 파일 포인터를 파일디스크립터로 변환하여 함수내에서 저수준의 FILE I/O 함수를 사용해서 같은 기능을 구현하게 하려는데요
제가 마주친 문제는
fseek() 함수를 구현하는데 lseek()를 사용해서 구현하려고 합니다.
int myFseek(FILE *fp, long offset, int whence){ off_t loc; int fd; int tmp_offset; fd = fileno(fp); loc = lseek(fd, offset, whence); printf("loc : %d\n",(int)loc); if(loc == -1){ perror("Offset Error"); return -1; } else return 0; }
위와 같이 구현을 해보았는데요. 문제점이 loc = lseek(fd, offset, whence) 부분에서
loc의 값이 현재 offset값이 나와야하는데 자꾸 파일의 전체 바이트 값이 나옵니다.ㅠ
무엇이 잘 못 짜여졌는지좀 알려주세요.(3시간째 어떻게 해결해야하는지 몰라서 헤매고 있습니다.ㅠ)
myFopen과 myFclose는 제대로 작성이 되었는지도 궁금합니다.ㅠ
혹시 몰라 전체 작성중이던 소스를 첨부합니다
#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #define BUFFSIZ 1024 FILE *myFopen(char name[], char *mode){ int fd; FILE *fp; fd = open(name, *mode); if(fd==-1) { perror("Open error"); exit(1); } fp = fdopen( fd, mode ); return fp; } FILE *myFclose(FILE *fp){ int fd; fd = fileno(fp); close(fd); return (FILE *)fd; } int myFseek(FILE *fp, long offset, int whence){ off_t loc; int fd; int tmp_offset; tmp_offset = ftell(fp); fd = fileno(fp); lseek(fd,tmp_offset,SEEK_SET); loc = lseek(fd, offset, SEEK_CUR); printf("loc : %d\n",(int)loc); if(loc == -1){ perror("Offset Error"); return -1; } else return 0; } int myFtell(FILE *fp){ int off_set; int fd; fd = fileno(fp); off_set = lseek(fd, 0, SEEK_CUR); return off_set; } int myFsetpos(FILE *fp, const fpos_t *pos){ int fd; fd = fileno(fp); return 0; } int myFgetpos(FILE *fp, fpos_t *pos){ } int main(int argc, char*argv[]) { FILE *fp; int n; long cur; char buf[BUFFSIZ]; if ((fp = myFopen(argv[1], "r")) == NULL) { perror("myFopen"); exit(1); } cur = myFtell(fp); printf("Offset cur=%d\n", (int)cur); n = fread(buf, sizeof(char), 4, fp); buf[n] = '\0'; printf("-- Read Str=%s\n", buf); myFseek(fp, 1, SEEK_CUR); cur = myFtell(fp); printf("Offset cur=%d\n", (int)cur); n = fread(buf, sizeof(char), 6, fp); buf[n] = '\0'; printf("-- Read Str=%s\n", buf); cur = 12; fsetpos(fp, &cur); fgetpos(fp, &cur); printf("Offset cur=%d\n", (int)cur); n = fread(buf, sizeof(char), 13, fp); buf[n] = '\0'; printf("-- Read Str=%s\n", buf); myFclose(fp); printf("Check closed fp %p\n", fp); return 0; }
Forums:
댓글 달기