티스토리 뷰
안녕하세요 강정호입니다.
오늘은 파일 포지션에 대해서 공부해보겠습니다.
파일 포지션 : 파일 내용을 다룰 때, 어떤 Operation을 수행하는 위치.
ex) 현재 반짝이는 커서가 어디에 있는지.
파일 오프셋 : 파일의 시작지점부터 현재 커서의 위치까지 얼마나 떨어져 있는지 정수로 보여주는 것이 offset 값이다.
ftell 함수에 현재 살아있는 file 포인터를 인자로 넣어서 함수를 호출하면 long 타입으로 offset을 반환한다.
아래 설명에 나타나 있듯이 fseek()는 파일의 포지션을 변경할 수 있는 함수이다.
1) fseek(fp, 5, SEEK_SET) : 파일의 시작지점부터 5칸을 건너뛰고 6칸부터 파일포지션을 위치시킴.
2) fseek(fp, 5, SEEK_CUR) : 현재 파일 포지션에서 5칸을 건너뛴 후에 파일 포지션을 위치시킴.
3) fseek(fp, -5, SEEK_END) : 파일의 끝에서부터 5칸을 건너뛴 후 파일 포지션을 위치시킴.
#include <stdio.h>
#include <string.h>
static int create_file(void) {
FILE *fp;
if (!(fp = fopen("datafile", "w"))) {
printf("fopen() fail\n");
return -1;
}
printf("After fopen(). offset = %ld\n", ftell(fp));
fputs("hello world\n", fp);
fputs("hello world2\n", fp);
fputs("hello world3\n", fp);
fputs("hello world4\n", fp);
fputs("hello world5\n", fp);
printf("Before fclose(). offset = %ld\n"), ftell(fp);
printf("------------------------------------------------\n");
fclose(fp);
return 0;
}
static int read_file(void) {
FILE *fp;
char buf[1024];
if (!(fp = fopen("datafile", "r+"))) {
printf("fopen() fail\n");
return -1;
}
printf("After fopen(). offset = %ld\n", ftell(fp));
memset(buf, 0, sizeof(buf));
fgets(buf, sizeof(buf), fp);
printf("After fgets(). offset = %ld\n", ftell(fp));
fseek(fp, 0, SEEK_END);
printf("After fseek(). offset = %ld\n", ftell(fp));
fputs("final\n", fp);
printf("before fclose(). offsets = %ld\n", ftell(fp));
printf("------------------------------------------------\n");
fclose(fp);
return 0;
}
int main(int argc, char **argv) {
create_file();
read_file();
return 0;
}
[실행결과]
create_file(void)
-
fputs("hello world\n", fp); --> 12bytle(개행문자 \n 까지 포함)
-
fputs("hello world2\n", fp); -- > 13byte
-
fputs("hello world3\n", fp); --> 13byte
-
fputs("hello world4\n", fp); --> 13 byte
-
fputs("hello world5\n", fp); --> 13 byte
12 + 13 + 13 + 13 + 13 = 64byte.
read_file(void)
fseek() 를 이용해서 SEEK_END 파일 포지션을 파일의 맨 끝에 놓고, 거기에 final 문자열을 추가하여 64바이트에서 70바이트가 된 것이다.
이상으로 파일 포지션에 대해 다루어봤습니다.
'Back-end' 카테고리의 다른 글
[리눅스] 하드링크 vs 소프트링크 (0) | 2020.04.26 |
---|---|
C언어 문자자료형 사용하기 (0) | 2020.01.05 |
[루비] 예외 처리 (0) | 2019.02.13 |
[루비] 상속과 메시지 (0) | 2019.02.11 |
[루비] 객체로서의 블록 (0) | 2019.02.10 |
- Total
- Today
- Yesterday
- 항해플러스백엔드
- 도커
- 부동산공부
- Spring boot
- 2023년
- pop_back
- GIT
- 인셉션
- 월부닷컴
- docker
- push_back
- 유즈케이스
- Use case
- 월급쟁이부자들
- 항해솔직후기
- 깃
- ```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
- front
- github
- Inception
- 내년은 빡세게!!
- 폭포수
- 파라메터
- 관계대수
- 재테크공부
- 열반스쿨기초반
- 항해플러스후기
- 깃허브
- 개발자 회고
- resize
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |