본문 바로가기
c언어

c언어 임의 접근에 대하여 알아보기

by 개발자 L 2023. 2. 16.
반응형

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 입니다.

결과도 잘 나온 것을 볼 수 있습니다.

 

여기까지 임의 접근에 대하여 알아보았는데요,

다음 포스팅에서는 지금까지 배운 것들을 이용해서 여러 가지 문제들을 풀어보는 시간을 가져보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글