C 언어에서 파일 포인터 위치 조정: fseek, ftell, rewind 사용법과 예시

C 언어에서 파일을 다룰 때 파일 포인터 위치를 조정하는 기능은 매우 중요합니다. fseek, ftell, rewind 함수는 파일 내 위치를 정확하게 제어하고, 파일 작업을 효율적으로 수행하는 데 유용합니다. 본 기사에서는 이 함수들의 사용법과 예시를 통해 파일 포인터를 조작하는 방법을 상세히 설명합니다.

파일 포인터란?


파일 포인터는 파일에서 현재 작업 중인 위치를 가리키는 지표입니다. 이 위치는 데이터를 읽거나 쓸 때마다 변경됩니다. 파일 포인터는 파일을 탐색하는 데 중요한 역할을 하며, 파일을 열 때마다 초기 위치는 파일의 시작 부분이 됩니다. 파일 포인터의 위치를 조정함으로써, 파일 내의 다양한 부분에 접근하고 데이터를 처리할 수 있습니다.

`fseek` 함수 개요


fseek 함수는 파일 포인터를 지정한 위치로 이동시킬 수 있는 함수입니다. 오프셋을 기준으로 파일 내 특정 위치로 이동할 수 있어, 파일 탐색 시 유용합니다. 이 함수는 파일 포인터의 현재 위치를 변경하는 데 사용되며, 특정 기준에서의 상대적인 이동을 설정할 수 있습니다.

fseek 함수 구문


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

- **stream**: 위치를 이동할 파일 포인터  
- **offset**: 파일 내에서 이동할 바이트 수. 양수나 음수로 지정 가능  
- **whence**: 기준 위치를 지정하는 매개변수  
  - `SEEK_SET`: 파일의 시작을 기준으로 이동  
  - `SEEK_CUR`: 현재 위치를 기준으로 이동  
  - `SEEK_END`: 파일의 끝을 기준으로 이동  

이 함수는 이동이 성공하면 `0`, 실패하면 `-1`을 반환합니다.
<h2>`fseek` 사용 예시</h2>  
`fseek`을 사용하여 파일의 처음, 현재, 끝에서 특정 위치로 이동하는 방법을 예시로 설명합니다. 이를 통해 파일 탐색을 효율적으로 할 수 있습니다.

<h4>예시 코드</h4>  

c

include

int main() {
FILE *file = fopen(“example.txt”, “r”); // 파일 열기
if (file == NULL) {
printf(“파일을 열 수 없습니다.\n”);
return 1;
}

fseek(file, 0, SEEK_SET);  // 파일의 시작으로 이동
printf("파일의 시작으로 이동\n");

fseek(file, 10, SEEK_CUR); // 현재 위치에서 10바이트 이동
printf("현재 위치에서 10바이트 이동\n");

fseek(file, -5, SEEK_END); // 파일 끝에서 5바이트 앞당기기
printf("파일 끝에서 5바이트 앞당기기\n");

fclose(file); // 파일 닫기
return 0;

}

이 예시에서는 `fseek`을 사용해 파일의 시작으로 이동한 뒤, 현재 위치에서 10바이트를 이동하고, 마지막으로 파일 끝에서 5바이트를 앞당기는 작업을 수행합니다. 각 이동 후, 파일 포인터가 적절하게 업데이트됩니다.
<h2>`ftell` 함수 개요</h2>  
`ftell` 함수는 현재 파일 포인터가 가리키고 있는 위치를 반환하는 함수입니다. 파일 작업 중 현재 위치를 확인하고 싶을 때 사용됩니다. 이 함수는 주로 파일 탐색 후, 현재 파일 포인터의 정확한 위치를 알기 위해 사용됩니다. `ftell`은 반환된 위치 값을 기반으로 파일을 다시 탐색하거나 파일 처리 상태를 확인하는 데 유용합니다.

<h4>ftell 함수 구문</h4>  

c
long ftell(FILE *stream);

- **stream**: 위치를 확인할 파일 포인터  

이 함수는 파일 포인터의 현재 위치를 바이트 단위로 반환하며, 만약 오류가 발생하면 `-1L`을 반환합니다.
<h2>`ftell` 사용 예시</h2>  
파일 포인터가 가리키는 위치를 확인하는 방법을 예시로 보여줍니다. `ftell`을 활용하면 파일 작업 중에 현재 위치를 정확히 알 수 있어, 이후의 파일 작업을 제어하는 데 도움이 됩니다.

<h4>예시 코드</h4>  

c

include

int main() {
FILE *file = fopen(“example.txt”, “r”); // 파일 열기
if (file == NULL) {
printf(“파일을 열 수 없습니다.\n”);
return 1;
}

fseek(file, 0, SEEK_SET);  // 파일의 시작으로 이동
long pos = ftell(file);    // 현재 위치 반환
printf("현재 파일 위치: %ld\n", pos); // 위치 출력

fseek(file, 10, SEEK_CUR); // 현재 위치에서 10바이트 이동
pos = ftell(file);         // 이동 후 위치 확인
printf("10바이트 이동 후 파일 위치: %ld\n", pos);

fclose(file); // 파일 닫기
return 0;

}

이 코드에서는 `fseek`을 사용해 파일의 특정 위치로 이동한 뒤, `ftell`을 사용하여 그 위치를 출력합니다. 이를 통해 파일 탐색 중 현재 위치를 쉽게 추적할 수 있습니다.
<h2>`rewind` 함수 개요</h2>  
`rewind` 함수는 파일 포인터를 파일의 처음으로 되돌리는 함수입니다. `fseek`과 달리 오프셋을 지정할 수 없으며, 단순히 파일의 시작으로 이동시킵니다. 파일을 처음부터 다시 읽거나 처리할 때 유용하게 사용됩니다. 또한, `rewind`는 파일 포인터를 이동시킬 뿐만 아니라, 파일의 에러 상태를 초기화하는 역할도 합니다.

<h4>rewind 함수 구문</h4>  

c
void rewind(FILE *stream);

- **stream**: 파일 포인터  

`rewind` 함수는 반환 값이 없으며, 주로 파일을 처음부터 다시 읽거나 쓸 때 사용됩니다.
<h2>`rewind` 사용 예시</h2>  
`rewind`를 사용하여 파일 포인터를 처음으로 되돌리는 방법을 예시로 설명합니다. 이 함수는 파일을 다시 처음부터 읽거나 다른 처리를 하도록 할 때 유용합니다.

<h4>예시 코드</h4>  

c

include

int main() {
FILE *file = fopen(“example.txt”, “r”); // 파일 열기
if (file == NULL) {
printf(“파일을 열 수 없습니다.\n”);
return 1;
}

// 파일의 처음으로 이동
fseek(file, 10, SEEK_SET);  // 처음부터 10바이트 이동
printf("현재 위치: %ld\n", ftell(file)); // 현재 위치 출력

rewind(file);  // 파일의 처음으로 되돌리기
printf("파일 처음으로 돌아갔습니다.\n");

// 처음으로 돌아간 후 위치 확인
printf("현재 위치: %ld\n", ftell(file));

fclose(file); // 파일 닫기
return 0;

}
“`

이 예시에서는 fseek을 사용해 10바이트를 이동한 뒤, rewind를 사용하여 파일 포인터를 처음으로 되돌리고, 그 후 ftell을 사용해 현재 위치를 출력합니다. rewind를 통해 파일의 시작 부분으로 쉽게 돌아갈 수 있습니다.

파일 포인터 위치 조정 시 주의사항


파일 포인터 위치를 조정할 때는 몇 가지 주의해야 할 사항이 있습니다. 잘못된 위치 이동은 예기치 않은 동작이나 오류를 유발할 수 있으므로, 정확한 사용법을 익히는 것이 중요합니다.

파일 끝을 넘지 않기


파일 포인터를 이동할 때, 파일의 끝을 넘어서는 위치로 이동하려 하지 않도록 주의해야 합니다. 예를 들어, fseek(file, 1000, SEEK_END)와 같이 파일의 끝에서 너무 멀리 이동하려고 하면, 오류가 발생할 수 있습니다. 항상 파일의 크기 내에서 이동하도록 확인해야 합니다.

읽기 전용 파일에서의 위치 변경


파일을 읽기 전용 모드("r" 또는 "rb")로 열었을 경우, fseek 또는 rewind로 파일 포인터를 이동시키는 데 제한이 있을 수 있습니다. 만약 쓰기 작업이 필요하다면 파일을 "r+" 또는 "w+" 등의 쓰기 가능한 모드로 열어야 합니다.

파일이 정상적으로 열렸는지 확인


파일을 열 때 실패하면 파일 포인터는 NULL이 되어, 이후 위치를 조정하거나 읽기/쓰기 작업을 시도할 경우 문제가 발생할 수 있습니다. 따라서 파일을 열기 전에 항상 파일 포인터가 NULL이 아닌지 확인하는 것이 좋습니다.

파일 포인터 초기화


파일을 여러 번 읽거나 쓴 후, 파일 포인터를 적절히 초기화하지 않으면 예기치 않게 파일의 다른 부분을 읽게 될 수 있습니다. 파일을 처음부터 다시 읽고 싶다면 rewind를 사용하여 파일 포인터를 초기화하고, 원하는 작업을 반복할 수 있습니다.

요약


C 언어에서 파일 포인터 위치 조정 함수인 fseek, ftell, rewind는 파일 내 위치를 제어하는 데 중요한 역할을 합니다. fseek을 통해 파일 포인터를 원하는 위치로 이동시키고, ftell로 현재 위치를 확인하며, rewind를 사용해 파일을 처음으로 되돌릴 수 있습니다. 각 함수는 파일 작업 중 위치 조정과 탐색을 효율적으로 처리하는 데 유용합니다. 또한, 파일 포인터 위치를 조정할 때는 파일 끝을 넘지 않도록 주의하고, 파일 모드와 상태를 확인하여 오류를 예방해야 합니다.