C 언어 - 파일다루기 5 - 파일포인터(파일에서의 위치)

컴퓨터/C

728x90
반응형

파일 포인터

C언어 프로그래밍에서 파일을 사용하기 위해서 파일 스트림을 생성하고 파일 구조체로 된 포인터 변수에 대입을 해서 사용합니다. 이 파일 포인터는 파일의 위치를 제어하는 역할을 하게 됩니다. 

대부분의 편집기에서 문서를 작성하면 위치를 알기 위해서 커서가 존재합니다. 이 파일 포인터는 커서와 같은 역할을 해서 파일 내부에서 원하는 위치부터 데이터를 불러올 수 있게 됩니다.

 

편집기 예시

 

스트림 모드에 따른 파일 포인터

C언어에서 fopen 함수를 이용해서 파일 스트림을 생성합니다. 이때 스트림 모드가 크게 r , w , a 읽기 , 쓰기, 이어 쓰기 3가지 모드가 있다고 했는데요 그렇다면 스트림을 생성해서 파일 포인터에 대입하게 되면 파일에서 커서 역할을 하게 되는 파일 포인터의 위치는 어디에 있는지 알아보도록 하겠습니다.

 

  • r 모드 (읽기 모드)

읽기 모드의 경우 이미 만들어진 파일을 읽기위해서 가장 처음 위치에 파일의 포인터가 위치하게 됩니다.

 

  • w 모드 ( 쓰기 모드)

쓰기 모드 또한 이미 만들어진 파일 , 또는 새로운 파일의 가장 처음 위치에 파일의 포인터가 위치합니다.

  • a 모드 (이어 쓰기 모드)

이어 쓰기 모드 같은 경우 파일 포인터는 파일의 가장 마지막에 위치하게 됩니다.

텍스트 편집기라고 가정하면 아래와 같은 곳에 커서가 위치하는 것과 마찬가지입니다.

 

 

파일 포인터의 위치 제어해보기

파일 스트림을 통해 파일을 제어하여 사용하기 위해서는 파일 포인터의 위치는 아주 중요합니다.  그리고 자연스럽게 파일의 입출력 함수들을 통해 파일의 포인터를 움직이고 이동하고 있습니다. 하지만 원하지 않는 위치로 파일의 포인터가 이동한 경우 파일 포인터의 위치를 옮기고 싶을 때는 어떻게 해야 될까요. C언어에서는 파일 포인터의 위치를 제어하기 위해 함수를 제공해 줍니다.

 

  • rewomd() 함수
    • 파일 포인터의 위치를 연결된 스트림의 가장 처음으로 되돌린다.
  • fseek() 함수
    • 파일 포인터의 위치를 조정한다.

rewind()

파일 포인터의 위치를 가장 처음으로 돌릴 때 사용하는 함수입니다. 

함수의 원형은 아래와 같습니다.

#include <stdio.h>
void rewind(FILE* stream);

해당 함수를 사용하면 파일 포인터는 해당 연결된 파일 스트림의 가장 첫 번째 위치로 갑니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	FILE* file = fopen("Test.txt", "rt"); // 읽기 모드 파일 스트림 생성 및 파일 포인터 대입
	// 다양한 소스코드로 사용 후 파일 포인터의 위치를 처음으로 가고 싶을 때 
	rewind(file);
	fclose(file);
	return 0;
}

 

 

fseek()

사실 파일 스트림 안에서 파일 포인터의 위치를 제어하기 위해 가장 많이 사용하는 함수입니다. 

함수의 원형은 다음과 같습니다.

#include <stdio.h>
int fseek(FILE* stream, long int offset, int origin);
  • 첫 번째 인자 : 파일 포인터
  • 두 번째 인자 : 이동할 바이트의 수
  • 세 번째 인자 : 기준점 

세번째 인자의 경우 C언어에서 기준점을 제공하기 위한 3가지 메크로 상수(키워드)를 제공해 줍니다.

  • SEEK_SET 파일의 시작 지점
  • SEEK_CUR 현재 위치
  • SEEK_END 파일의 끝
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	FILE* file = fopen("Test.txt", "rt"); // 읽기 모드 파일 스트림 생성 및 파일 포인터 대입

	//fseek 함수를 통한 위치 제어 해보기

	//처음으로 부터 2번째로 파일 포인터 이동
	// 1번
	fseek(file, 2, SEEK_SET);
	printf("%c\n", fgetc(file));

	//처음으로 이동
	// 2번
	fseek(file, 0, SEEK_SET);
	printf("%c\n", fgetc(file));

	//현 위치에서 5칸 뒤로 이동
	// 3번
	fseek(file, 5, SEEK_CUR);
	printf("%c\n", fgetc(file));
	// 4번
	printf("%c\n", fgetc(file));
    
    //파일 종료
	fclose(file);
	return 0;
}

파일 포인터의 동작을 도식화하면 아래와 같습니다.

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :