[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를 관리해준다.