티스토리 뷰

※ 본 포스팅은 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다.




○ fseek :


fseek 함수는 fopen으로 호출된 파일에서의 현재 위치를 이동시킬 수 있는 함수다

인자로는 3개가 들어간다


첫 번째로는 파일포인터

두 번째로는 이동할 거리

세 번째는 어떻게 이동할지 방식이 들어간다


여기서 어떻게 이동할지를 정하는 방식에는 3가지가 있는데


1. SEEK_SET(0) : 파일의 처음 위치를 기준으로 이동한다.

2. SEEK_CUR(1) : 현재 파일의 위치를 기준으로 이동한다.

3. SEEK_END(2) : 파일의 마지막 위치를 기준으로 이동한다.


우선 임의의 텍스트 파일이 다음과 같이 있다.



그리고 다음과 같이 소스파일을 작성해서 값이 어떻게 출력되는지 확인해보면.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdio.h"
 
void main()
{
    char tmp[10];
    FILE *fp=fopen("test.txt", "r");
    fgets(tmp, 3, fp);    //fp 스트림에서 NULL포함 3byte를 긁어와 tmp에 저장
    printf("%s ", tmp);
 
    fseek(fp, 4, 0);    //파일의 처음 위치에서 4byte 떨어진 위치로 이동
    fgets(tmp, 3, fp);
    printf("%s ", tmp);
 
    fseek(fp, 2, 1);    //현재 위치에서 2byte 떨어진 위치로 이동
    fgets(tmp, 3, fp);
    printf("%s ", tmp);
 
    fseek(fp, -2, 2);    //파일의 끝에서 -2byte 떨어진 위치로 이동
    fgets(tmp, 3, fp);
    printf("%s ", tmp);
}



와 같다


우선 fseek(fp, 4, 0)에서는 처음 위치에서 4 떨어진 위치이므로 0,1,2,3을 건너뛰고 


4 5가 출력되었고, 이제 현재 위치가 6이 되었으므로 fseek(fp, 2, 1)에서 현재 위치 +2가 되어 


6, 7을 건너뛰고 8 9가 출력되었다. 마지막으로 fseek(fp, -2, 2)는 끝 위치에서 -2 이므로 


파일의 끝(eof)에서 두칸 당겨 져와 2개의 문자를 출력했으므로 ef가 출력되었다.




○ ftell


ftell 함수는 심플하게 파일을 읽거나 쓰면서 이동하는 현재 위치의 위치 값을 반환한다


인자로는 파일 포인터 하나가 들어가면 방금 fseek 함수 예제 에서 사용한 test.txt를 그대로 


사용하여 다음 소스코드와 실행결과를 보면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdio.h"
 
void main()
{
    char tmp[20];
    FILE *fp=fopen("test.txt", "r");
    printf("fscanf전 위치 : %d\n", ftell(fp));    
  //아직 파일 포인터를 사용한 작업이 없으므로 현재위치는 0
 
    fgets(tmp, 4+1, fp);    
  //fgets를 통해 NULL 1바이트를 포함한 4글자를 가져온다.
 
    printf("fgets로 4개를 가져온 후 위치 : %d\n", ftell(fp));
    fscanf(fp, "%s", tmp);    
  //나머지 문자들을 fscanf를 통해 모두 긁어온다.
 
    printf("fscanf %%s후 위치 : %d\n", ftell(fp));
}




처음에는 파일 포인터를 사용한 작업이 없었으므로 당연히 첫 ftell의 값은 0이다


다음으로 fgets를 통해 4글자를 긁어오는 작업을 한 후 ftell를 사용한 값을 보면 4


마지막으로 모든 문자열을 긁어오는 작업을 한 후에 ftell을 사용하면 16이다.

(전체 문자열의 길이는 16)



프로필사진

Yowu (Yu Yongwoo)

흔한 백엔드 개발자입니다
우분투 데스크탑 개발 환경을 선호합니다
최근에는 vscode에 neovim 모드 올려서 쓰고 있습니다
개발용 키보드는 역시 해피해킹 프로2 무각입니다
락 밴드에서 드럼을 쳤습니다

«   2021/04   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
글 보관함
Total
3,128,695
Today
114
Yesterday
837