이번 글에서는 작성된 C 프로그램 자신의 소스 코드를 그대로 출력하는 방법을 알아보겠습니다. 즉, 자기 자신의 소스를 화면에 출력하는 C 프로그램을 작성하는 것입니다.
핵심 아이디어: 파일 시스템 활용
가장 간단한 방법은 C의 파일 시스템을 활용하는 것입니다. 예를 들어 코드를 "code1.c"라는 파일에 작성했다면, 해당 파일을 읽기 모드로 열어 파일의 모든 내용을 읽은 뒤 출력 화면에 결과를 표시하면 됩니다.
하지만 파일을 읽기 모드로 열기 전에, 현재 작성 중인 파일의 이름을 알아야 한다는 문제가 있습니다. 이때 유용하게 사용할 수 있는 것이 바로 __FILE__ 매크로입니다. 이 매크로는 기본적으로 현재 파일의 경로를 문자열로 반환합니다.
__FILE__ 매크로 예제
#include<stdio.h>
int main() {
printf("%s", __FILE__);
}위 프로그램을 실행하면 코드가 작성된 소스 파일의 경로가 출력됩니다. 즉, __FILE__ 매크로는 이 매크로가 사용된 현재 프로그램 파일의 경로를 담은 문자열을 반환합니다.
따라서 이 매크로를 파일 시스템과 결합하여, 현재 코드가 작성된 파일을 읽기 모드로 열려면 다음과 같이 작성하면 됩니다.
fopen(__FILE__, "r");
알고리즘
시작
Step 1 -> int main(void) 함수에서
문자형 변수 c 선언
FILE 포인터 "file"로 "__FILE__" 파일을 읽기 모드로 열기
do-while 반복문으로 c != EOF(파일 끝)까지 수행
c = fgetc(file)
putchar(c)
파일 "file" 닫기
종료전체 구현 예제
#include <stdio.h>
int main(void) {
// 소스 코드를 출력하기 위한 변수
char c;
// __FILE__은 현재 C 프로그램 파일의
// 위치(경로)를 가져옵니다.
FILE *file = fopen(__FILE__, "r");
do {
// 파일의 내용을
// 한 글자씩 출력합니다.
c = fgetc(file);
putchar(c);
}
while (c != EOF);
fclose(file);
return 0;
}실행 결과
#include <stdio.h>
int main(void) {
// 소스 코드를 출력하기 위한 변수
char c;
// __FILE__은 현재 C 프로그램 파일의
// 위치(경로)를 가져옵니다.
FILE *file = fopen(__FILE__, "r");
do {
// 파일의 내용을
// 한 글자씩 출력합니다.
c = fgetc(file);
putchar(c);
}
while (c != EOF);
fclose(file);
return 0;
}코드 설명
프로그램의 동작 흐름을 정리하면 다음과 같습니다.
1. 파일 열기: fopen(__FILE__, "r")을 통해 현재 실행 중인 소스 파일 자신을 읽기 모드로 엽니다. __FILE__ 매크로 덕분에 파일 이름을 하드코딩하지 않아도 됩니다.
2. 문자 단위 읽기 및 출력: fgetc() 함수로 파일에서 한 문자씩 읽어오고, putchar() 함수로 그 문자를 화면에 출력합니다. 이 과정을 do-while 반복문으로 파일의 끝(EOF)에 도달할 때까지 반복합니다.
3. 파일 닫기: 모든 내용을 출력한 후에는 fclose() 함수로 파일을 반드시 닫아 리소스 누수를 방지해야 합니다.
이처럼 __FILE__ 매크로와 기본적인 파일 입출력 함수만 활용하면, 별도의 복잡한 로직 없이도 자기 자신의 소스 코드를 그대로 출력하는 프로그램을 쉽게 만들 수 있습니다.