Computer Security

#3 파일 포지션 본문

리눅스 시스템 프로그래밍

#3 파일 포지션

쿠리 Kuri 2022. 9. 8. 18:30
반응형

파일 포지션 

 

파일 내용을 다룰 때, 어떤 Operation을 수행하는 위치. ex) 현재 반짝이는 커서가 어디에 있는지. 파일 오프셋 : 파일의 시작지점부터 현재 커서의 위치까지 얼마나 떨어져 있는지 정수로 보여주는 것이 offset 값이다.

 

 

 

 


파일 포지션 - 현재 오프셋 가져오기

 

long ftell (FILE *stream) ;

 

파라미터

- stream : 열린 파일 포인터

 

반환 값

- 성공시 파일 포지션(오프셋 값)

- 실패시 -1

 

 

 


파일 포지션 - 오프셋 설정

 

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

 

파라미터 

- stream : 열린 파일 포인터

- offset : 오프셋 값(양수/음수 모두 가능)
- whence : 오프셋의 기준

      - SEEK_SET : 파일의 시작 기준

      - SEEK_END : 파일의 끝 기준

      - SEEK_CUR : 현재 파일 포지션의 기준

 

반환 값

- 성공시 파일 포지션(오프셋 값)
- 실패시 -1

 

 

 

 

 


파일 포지션값을 긁어오는 함수  ftell()

 

long ftell(FILE *stream);

 

열린 파일포인터를 넣어주면 long타입으로 반환해준다.

 

 

 

 


실습 1


파일 포지션 값을 읽어서 출력 해보자.

 

1. vi 명령어를 이용해 file.c 예제 코드를 아래와 같이 작성 해준다.

file.c

1. file 포인터를 선언 해준뒤, datafile 로 하고 w 모드로 오픈한다.

 

2. 파일 포지션값을 긁어오는 함수  ftell() 를 이용해 첫번째줄의 파일 포지션 값을 출력해준다.

 

3. fputs 명령어를 이용해 한 라인씩 파일을 저장한다.

 

4. 파일 포지션값을 긁어오는 함수  ftell() 를 이용해 마지막 줄의 파일 포지션 값을 출력해준다.

 

5. int main 함수에서 동작 해준다.

 

 

 

 


2. gcc 명령어를 이용해 file 로 컴파일 해준다.

gcc

 

 

 

 

 


3. ./file 명령어를 이용해 파일 포지션을 확인하고, cat datafile을 이용해 코드도 확인해본다.

./file

 

 

 

 

 


실습 2 


열려있는 파일에서 read권한으로 파일을 읽어 들여서 파일 포지션 위치를 출력하는 예제를 해보자.

 

1. read_file 함수를 위의 코드에서 추가해준다.

 

 

 

 

 


2. gcc 로 컴파일 해준뒤, ./file 을 이용해 결과값을 출력 해보자.

./file

위에 두줄은 원래 나온 함수이고,

아래 두줄이 read 함수이다.

 

read 함수 결과값을 살펴보면

처음에 실행 했을때 offset이 0이였으나, 

한줄을 읽고 난뒤(fgets), offset이 12임을 알 수 있다.(hello world가 공백포함 12글자 이기 때문에)

 

 

 

 

 


실습 3 


1. fseek 명령어를 이용해 파일의 끝으로 이동한 후, 추가 해보자.

1. 위의코드에서 read 함수 내용을 수정할텐데, r 이아니라 r+모드로 바꿔주자( r 은 쓰기권한 x)

2. fseek 명령어를 통해 파일포지션을 끝으로 이동 해주자.

3. fseek(fp, 0, SEEK_END);   (SEEK_END 는 파일의 끝을 뜻한다.)

 

 

 

 


2. 결과 값을 확인 해보자.

./file

잘 보면, 4번째 줄에는 offset 이 12임을 알 수 있었는데, fseek 명령어로 파일의 끝으로 옮기니 54가 되는 것을 알 수 있다.

 

또한, final 이라는 것을 fputs를 통해 넣어준뒤의 offset은 60임을 알  수 있다.(정상적으로 넣어 졌다는 뜻)

 

 

 

 

 


3. cat 명령어를 통해 확인해보자.

cat

정상적으로 final이 맨 끝에 입력 된 것을 알 수 있다!

반응형
Comments