c언어 임의 접근에 대하여 알아보기
네 안녕하세요, 이번 포스팅에서는 임의 접근에 대하여 알아보도록 하겠습니다.
파일의 접근 방식은 크게 두 가지가 있습니다.
- 순차 접근
- 임의 접근
이 중에 지금까지 우리는 파일을 처음부터 순차적으로 읽거나 기록하는 순차 접근을 썼는데,
이번에는 파일의 어느 위치에서든 읽고 쓰기가 가능한 임의 접근법에 대하여 좀 더 중점적으로 알아보도록 하겠습니다.
그럼 지금부터 시작하도록 하겠습니다.
1. 임의 접근의 원리
임의 접근 역시 파일 포인터를 사용합니다.
하지만 순차 접근과는 큰 차이가 있는데,
보통의 경우라면 파일 포인터는 파일의 시작 위치를 가리키고 있으며,
거기서부터 하나씩 순차적으로 올라가며 포인터가 갱신되는 게 일반적입니다.
그렇지만 임의 접근법은 파일 포인터를 이동을 시켜서 임의대로 우리가 읽거나 수정하고 싶은 부분에 접근합니다.
그리고 이를 도와주는 함수의 이름은 fseek() 함수 입니다.
이 함수를 이용해서 위치 표시자를 조작합니다.
2. 파일 포인터 관련 함수
2 - 1. fseek()
아까 말씀드렸던 fseek() 함수가 바로 관련 함수입니다.
이 함수의 사용 방법은 이렇습니다.
in fseek(FILE *fp, long offset, int origin); // *fp : 파일 포인터, offset : 거리, origin : 기존 위치
이 함수의 구성은 이렇습니다.
- 파일 포인터(*fp)
- 위치 표시자가 기준 위치로부터 이동하는 거리(offset)
- 위치 표시자를 이동시키는 기준 위치(origin)
이렇게 구성이 되어있으며, 이 중에 처음 보는 offset과 origin에 대하여 말씀드리도록 하겠습니다.
2 - 1 - 1. offset
offset은 위치 표시자가 기준 위치로부터 이동을 한 거리에 대하여 나타내주는 값입니다.
그래서 이 offset의 값이 양수라면 앞으로 가고, 음수라면 뒤로 갑니다.
2 - 1 - 2. origin
origin은 위치 표시자를 이동시키는 기준 위치, 다시 말하면 원래 파일 포인터가 있던 위치를 말합니다.
그리고 여기에는 몇 가지 값을 써서 나타냅니다.
상수 | 값 | 설명 |
SEEK_SET | 0 | 파일의 시작 |
SEEK_CUR | 1 | 현재 위치 |
SEEK_END | 2 | 파일의 끝 |
그래서 이 origin 값을 기준으로 하여 offset의 값을 양수 또는 음수로 지정해 주면,
그만큼 파일 포인터가 이동하여 파일을 보여줍니다.
예를 들어서 이런 함수를 입력했다 해봅시다.
fseek(fp, 2, SEEK_SET);
이렇게 입력을 하게 되면 파일의 시작점으로부터 2 만큼 이동하라는 뜻이 됩니다.
그리고 여기저기 이동했다가 파일의 여는 위치를 시작점으로 설정하려면 rewind() 함수를 쓰면 됩니다.
이런 식으로 말이죠.
rewind(fp);
이렇게 되면 위치 표시자가 0이 되고, 보통 파일을 다시 일고자 할 때 씁니다.
2 - 2. ftell()
ftell() 함수는 위치 표시자의 현재 위치를 알고자 할 때 씁니다.
리눅스에서 쓰는 pwd 명령어와 비슷합니다.
pwd 명령어 역시 현재 자기가 있는 디렉터리의 위치를 알려주는 명령어이기 때문입니다.
사용방법은 이렇습니다.
long ftell(FILE *fp);
보통 위치 표시자를 쓸 때는 long형을 씁니다.
그 이유는 파일의 양이 매우 클 때도 있기 때문입니다.
2 - 3. feof()
feof() 함수는 파일의 끝을 알아내는 함수입니다.
그래서 현재 위치가 파일의 끝인 지를 알고 싶을 때 이 함수를 씁니다.
이 함수가 필요한 이유는 이진 파일의 경우는 -1의 값이 파일의 끝을 알려주는 값이 아니고,
그냥 이진 파일에 기록이 되어있는 데이터의 값일 수 있기 때문입니다.
그 이유는 이진 파일에는 데이터가 들어가면 그냥 데이터일 뿐,
시작과 끝을 알리는 데이터가 크게 정해져 있지 않기 때문입니다.
사용 방법은 이렇습니다.
int feof(FILE *fp);
이제 이들을 가지고서 한 번 간단한 코드를 작성해 보도록 하겠습니다.
#include <stdio.h>
int main()
{
FILE *fp;
char buffer[100];
fp = fopen("sample.txt", "wt");
fputs("ABCDEFGHIJKLMNOPQRSTUVWXYZ", fp);
fclose(fp);
fp = fopen("sample.txt", "rt");
fseek(fp, 3, SEEK_SET);
printf("fseek(fp, 3, SEEK_SET)의 값은 %c 입니다.\n", fgetc(fp));
fseek(fp, -1, SEEK_END);
printf("fseek(fp, -1, SEEK_END)의 값은 %c 입니다.\n", fgetc(fp));
fclose(fp);
return 0;
}
이렇게 해서 임의 접근을 하는 코드를 작성해 봤는데,
결과를 한 번 보도록 하겠습니다.
fseek(fp, 3, SEEK_SET)의 값은 D 입니다.
fseek(fp, -1, SEEK_END)의 값은 Z 입니다.
결과도 잘 나온 것을 볼 수 있습니다.
여기까지 임의 접근에 대하여 알아보았는데요,
다음 포스팅에서는 지금까지 배운 것들을 이용해서 여러 가지 문제들을 풀어보는 시간을 가져보도록 하겠습니다.
긴 글 읽어주신 독자분들께 진심으로 감사드립니다~
'c언어' 카테고리의 다른 글
c언어 전처리기에 대하여 알아보기 (0) | 2023.02.17 |
---|---|
c언어 스트림과 파일 입출력을 이용하여 여러가지 문제 풀어보기(파일에서 특정 문자열 탐색하기, 이진 파일에 학생 정보 저장하기(데이터베이스 흉내내기), 이미지 파일 복사하기(이진 파일 .. (0) | 2023.02.17 |
c언어 이진 파일 읽고 쓰는 법과 버퍼에 대하여 알아보기 (0) | 2023.02.16 |
c언어 텍스트 파일 읽는 법과 쓰는 법 알아보기 (0) | 2023.02.16 |
c언어 파일의 기초에 대하여 알아보기 (0) | 2023.02.15 |
댓글