Jiyong's STUDY

fseek, 파일 위치와 관련된 함수. 본문

프로그래밍/C

fseek, 파일 위치와 관련된 함수.

Kingjiyong 2018. 5. 31. 03:42

파일 위치 지시자의 위치를 변경하게 해주는 함수


#include <stdio.h>

int fseek(FILE *stream, long offset, int wherefrom);


파일 위치 지시자? 처음 들어보는 말일 수도 있다.


이 지시자가 무엇이고 어디에 있는 지를 말하기에 앞서, 파일 구조체에 대하여 말하자면

파일 구조체는 환경에 따라 다르다. 그러므로 파일 구조체가 어떻게 구성되었는지는 알기 힘들다.

당연한 것이다. 왜냐하면 파일 스트림을 만드는 주체는 프로그래머가 아닌 운영체제이기 때문이다.


하지만 이것은 분명히 말할 수 있다. 파일 위치 지시자는 어느 환경에서도 파일 구조체의 멤버 중 하나다.


파일 위치 지시자는 쉽게 말해서 파일을 어디까지 읽어 들였는지, 받아 들였는지에 대한 위치를 가리킨다.

파일에 Hello World라는 내용이 있다고 해보자.

파일에서 입력받아 Hello까지 읽어 들였다고 하면, 파일 위치 지시자는 Hello 뒤에 있다.

ㅡ남은 내용을 전부 읽어들이면 공백까지 포함하여  World가 읽어진다.


여기서 fseek는 그 파일 위치 지시자를 움직일 수 있게 해주는 함수이다.


사용법을 알아보면,

두번째 인자에는 앞뒤 방향으로 얼마나 움직일지에 대한 정보를 정수로 받는다. (음수일 땐 앞으로, 양수일 땐 뒤로)

세번째 인자에는 위치 변경을 하기 위한 기준을 정수로 받는다.

이 인자에 대한 상수는 정의되어 있다.

SEEK_SET // 0과 같다. 이 상수는 파일의 시작을 기준으로 지정하겠다는 의미이다.

SEEK_CUR // 1과 같다. 이 상수는 현재 지시자의 위치를 기준으로 지정하겠다는 의미이다.

SEEK_END // 2와 같다. 이 상수는 파일의 끝을 기준으로 지정하겠다는 의미이다.


int main() {

FILE *fp=fopen("seek.bin", "rb");

char arr[6];

char num;

fread((void *)arr, sizeof(char), 5, fp);

arr[5]='\0';

puts(arr);

fseek(fp, SEEK_SET, 0);

fread((void *)arr, sizeof(char), 5, fp);

arr[5]='\0';

puts(arr);

fseek(fp, SEEK_END, 0);

fread((void *)&num, sizeof(char), 1, fp);

putchar(num);

fclose(fp);

}


(seek.bin에 Hello SEEK! 라는 내용이 있다고 한다면)

결과 >> 

Hello

Hello

EOF


코드가 조금 지저분하긴 해도 간단히 사용법을 볼 순 있다.

fread로 Hello까지 읽어 들였으나 fseek 함수를 통해 처음으로 지시자를 옮겨

SEEK!가 아닌 Hello를 한번 더 나오게 했다.


그리고 세 번째 fseek 함수에서는 지시자를 맨 뒤로 옮겨서 문자를 출력했다.

하지만 느낌표가 아닌 EOF가 출력 된 것을 볼 수 있다.


그럼 여기서 우리는 알 수 있다.

문자열의 끝에는 \0, 즉 끝을 알리는 널 문자가 있듯이 파일의 끝에는 EOF가 있다.

이를 모른다면 fseek 함수를 쓸 때 원치 않는 위치를 가리킬 수 있다는 점을 기억하자.