[Linux] fseek / ftell 함수
파일을 읽을 때 파일 구조체 내부엔 포인터가 존재하며, 해당 포인터를 옮기는 작업이 중요하다.
fseek
파일을 읽기/쓰기 동작을 할 때 포인터의 위치를 변화시킨다.
int fseek(FILE *stream, long offset, int whence);
Option | Description |
---|---|
SEEK_SET | 파일의 시작 |
SEEK_CUR | 현재 읽기/쓰기 포인터 위치 |
SEEK_END | 파일의 끝 |
인자
Argument | Description |
---|---|
FILE *stream | 대상 파일 스트림 |
long offset | 이동할 바이트 수 |
int whence | 시작 시점 |
반환값
Return | Description |
---|---|
int | 0을 반환, 오류가 발생하면 -1을 반환 |
ftell
스트림의 위치 지정자의 현재 위치를 구한다.
long ftell(FILE *stream);
인자
Argument | Description |
---|---|
FILE *stream | 작업을 수행할 스트림의 파일 객체를 가리키는 포인터 |
반환값
Return | Description |
---|---|
long | 성공적으로 수행하였다면 현재의 위치 포인터가 가진 값이 리턴된다. 만일 오류가 발생하였다면 -1L 반환 |
Example
파일의 크기를 반환하는 코드를 아래처럼 작성 할 수 있다.
#include <stdio.h> int get_fsize(FILE *fp) { int fsize, fpos; fpos = ftell( fp ); // save current pointer position fseek( fp, 0, SEEK_END ); // move pointer to end of file fsize = ftell( fp ); // get pointer position fseek( fp, fpos, SEEK_SET ); // move pointer to previous position return fsize; } int main(int argc, char **argv) { FILE *fp; int fsize; char buff[1024]; int ret; fp = fopen( argv[1], "r" ); fgets( buff, sizeof buff, fp); fputs( buff, stdout ); fsize = get_fsize(fp); fgets( buff, sizeof buff, fp); fputs( buff, stdout ); fclose(fp); printf("%s size=%d\n", argv[1], fsize ); return 0; }
shumin@mercury:~/workspace/03_System_Programming/standard_io$ ./a.out test.txt AI Computer Architecture Machine Learning test.txt size=120 shumin@mercury:~/workspace/03_System_Programming/standard_io$ ls -l test.txt -rw-rw-r-- 1 shumin shumin 120 Apr 13 22:28 test.txt
위 코드에서 fgets()
를 수행하게 되면 파일 포인터가 변경되게 되는데, 그럴 경우 fclose()
가 수행되기 전까지 pointer의 값을 유지해야한다. 따라서 pointer 위치를 유지하기 위해 get_fsize()
내부에 fseek()
과 ftell()
을 통해 file pointer를 관리해준다.