정의
파일 끝(End‑Of‑File, EOF) 은 컴퓨터 파일 시스템에서 파일의 내용이 더 이상 존재하지 않음을 나타내는 논리적 개념이다. 프로그램이 파일 스트림을 읽는 과정에서 EOF 신호를 감지하면, 파일의 마지막 바이트 이후로 읽을 데이터가 없다는 것을 인식하고 읽기를 종료한다.
주요 특징
| 항목 | 내용 |
|---|---|
| 표현 방식 | 파일 포맷마다 다르지만, 일반적으로 파일의 물리적 크기(바이트 수)와 일치한다. 일부 텍스트 파일에서는 EOF 문자(예: Ctrl+Z (0x1A) for DOS)나 특수 마커가 사용될 수 있다. |
| 시스템 호출 | Unix/Linux 계열에서는 read() 함수가 0 바이트를 반환하거나, feof() 함수가 true를 반환함으로써 EOF를 나타낸다. Windows에서는 ReadFile()이 FALSE와 GetLastError()가 ERROR_HANDLE_EOF를 반환한다. |
| 프로그래밍 언어 | - C/C++: stdio.h의 feof(FILE *stream) - Python: 파일 객체의 read()가 빈 문자열('')을 반환 - Java: InputStream.read()가 -1을 반환 |
| 예외 처리 | 파일이 정상적으로 끝났는지 확인하지 않으면 무한 루프나 데이터 손실이 발생할 수 있다. 따라서 EOF 검사는 파일 입출력 로직에서 필수적인 방어 코드이다. |
역사
- 초기 컴퓨팅 : 텍터 파일 시스템이 없던 시절, 파일의 끝을 표시하기 위해 특별한 제어 문자(예:
Ctrl+Z)가 사용되었다. - UNIX 등장 : 1970년대 초 UNIX는 파일 크기 메타데이터를 파일 시스템에 저장함으로써 물리적 EOF 마커 없이도 파일 끝을 인식하도록 설계하였다. 이는 이후 대부분의 현대 운영체제에서 채택된 방식이다.
활용 예시 (C 언어)
#include <stdio.h>
int main(void) {
FILE *fp = fopen("data.txt", "r");
int ch;
if (!fp) {
perror("파일 열기 실패");
return 1;
}
while ((ch = fgetc(fp)) != EOF) { // EOF에 도달할 때까지 한 문자씩 읽음
putchar(ch);
}
if (feof(fp))
printf("
[EOF 도달]
");
else if (ferror(fp))
perror("읽기 오류");
fclose(fp);
return 0;
}
관련 용어
- 스트림(Stream) : 연속적인 데이터 흐름을 추상화한 개념으로, 파일 입출력은 스트림 기반으로 동작한다.
- 버퍼(Buffer) : 입출력 효율을 높이기 위해 데이터 조각을 임시 저장하는 메모리 영역. EOF 발생 시 버퍼가 비워진다.
- 시그널(Signal) : 일부 운영체제에서 파일 끝에 도달했을 때 프로세스에 전달되는 이벤트(예:
SIGPIPE).
참고 문헌
1. Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language (2nd ed.). Prentice Hall.
2. Love, R. (2010). Linux Kernel Development (3rd ed.). Addison‑Wesley.
3. Python Software Foundation. (2024). Python Documentation – Built‑in Functions. https://docs.python.org/3/library/functions.html#open
4. Oracle Corporation. (2023). Java Platform SE Documentation – InputStream. https://docs.oracle.com/javase/8/docs/api/java/io/InputStream.html
파일 끝 은 파일 입출력의 기본 개념이자, 다양한 프로그래밍 언어와 운영체제에서 동일하게 적용되는 핵심적인 원칙이다. 이를 정확히 이해하고 적절히 처리하는 것이 안정적인 소프트웨어 개발에 필수적이다.