-
fseek()Visual Studio/C 기초 2012. 11. 5. 18:18
fseek()
앞의 포스트에서 ftell()과 rewind()를 이용해 위치표시를 재설정하는 방법에 대해 설명했습니다. fseek()는 스트림의 위치표시를 더욱 정확하게 제어하기 위해서 사용되는 함수입니다. fseek()를 사용하면 위치표시가 파일 내에서 랜덤한 위치를 가리키도록 설정할 수 있습니다.
fseek(FILE *fp, long offset, int origin);
fp는 파일에 대한 포인터입니다. 자주 언급하는 내용이니 넘어가겠습니다. 위치표시가 이동되는 거리는 offset에 바이트 단위로 지정되기 때문에 sizeof()많이 사용합니다. origin은 이동이 시작되는 위치를 지정합니다. origin에 사용할 수 있는 기호 상수가 따로 있기 때문에 알려드리겠습니다.
*origin에 사용할 수 있는 기호상수는 io.h에 정의되어 있기 때문에 io.h도 포함시켜주시기 바랍니다.
SEEK_SET
0
위치표시를 파일의 시작부터 offset 바이트 뒤로 이동합니다.
SEEK_CUR
1 위치표시를 현재 위치에서 offset 바이트 뒤로 이동합니다.
SEEK_END 2
위치표시를 파일의 마지막부터 offset 바이트 앞으로 이동합니다.
fseek()함수의 동작이 성공적이라면 0을 돌려주고 에러가 발생하면 0이 아닌 다른 값을 돌려줍니다.(반드시 -1을 돌려주는 것은 아니니 주의해주세요!) 예제를 보겠습니다.
#include <stdio.h>
#include <stdlib.h>
#include <io.h>#define MAX 50
main(){
FILE *fp;
int data, count, arr[MAX];
long offset;
char filename[20];
for(count=0; count<MAX; count++) //배열을 초기화 합니다.
arr[count]=count*10;puts("쓰기상태로 파일을 엽니다. 파일이름을 입력해주세요.");
gets(filename);
if((fp=fopen(filename,"wb"))==NULL){
fprintf(stderr,"파일을 여는데 실패했습니다!\n");
exit(1);
}if((fwrite(arr,sizeof(int),MAX,fp)) !=MAX)
{
fprintf(stderr,"파일에 데이터를 쓰는데 실패했습니다!\n");
exit(1);
}
fclose(fp);if((fp=fopen(filename,"rb"))==NULL){
fprintf(stderr,"파일을 여는데 실패했습니다!\n");
exit(1);
}while(1)
{
printf("요소 0~%d를 읽어들입니다. -1를 입력하면 프로그램은 종료됩니다. : ",MAX-1);
scanf("%d",&offset);
if(offset < 0)
break;
else if(offset > MAX-1)
continue;if((fseek(fp,(offset*sizeof(int)),SEEK_SET)) != 0){ //위치 표시를 파일의 시작으로부터 0만큼 뒤로 이동시킵니다.
fprintf(stderr,"함수 fseek()사용 오류입니다.\n");
exit(1);
}
fread(&data,sizeof(int),1,fp);
printf("입력한 요소 %ld의 값은 %d입니다.\n",offset,data);
}
fclose(fp);
}'Visual Studio > C 기초' 카테고리의 다른 글
remove() (0) 2013.05.15 feof() (0) 2013.02.14 ftell(), rewind() (0) 2012.11.04 fscanf(), fwrite(), fread() (0) 2012.11.04 fprintf() (0) 2012.10.22