Linux,  Programming

[Linux] fseek / ftell 함수

파일을 읽을 때 파일 구조체 내부엔 포인터가 존재하며, 해당 포인터를 옮기는 작업이 중요하다.

fseek

파일을 읽기/쓰기 동작을 할 때 포인터의 위치를 변화시킨다.

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

OptionDescription
SEEK_SET파일의 시작
SEEK_CUR현재 읽기/쓰기 포인터 위치
SEEK_END파일의 끝

인자

ArgumentDescription
FILE *stream대상 파일 스트림
long offset이동할 바이트 수
int whence시작 시점

반환값

ReturnDescription
int0을 반환, 오류가 발생하면 -1을 반환

ftell

스트림의 위치 지정자의 현재 위치를 구한다.

long ftell(FILE *stream);

인자

ArgumentDescription
FILE *stream작업을 수행할 스트림의 파일 객체를 가리키는 포인터

반환값

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

Leave a Reply

Your email address will not be published. Required fields are marked *