파일이름을 입력하면 그 파일에 포함된 확장지시어를 찾아서
순환적으로 파일을 확장하는 프로그램이다.
확장지시어는
#include "nextfile.txt"
와 같이 #include 다음에 빈칸을 한칸 띄우고
쌍따옴표로 인용한 파일이름을 주도록 한다.
#include <stdio.h>
#include <string.h>
// 현재의 줄에 #include "....." 형식이 있는지
// 조사해서 아니면 0을 반환하고
// 맞으면 끝의 "의 위치를 반환한다.
int check(char line[]) {
char inc[]="#include \"";
int i=0;
while(inc[i]==line[i]) { i+=1; }
if(i<9) return 0;
while(line[i]!='\"') { i+=1; }
return i;
}
// 다음 expand해야할 파일이름을 name에 복사한다.
void copy(char name[], char line[], int end) {
int i=0;
while(i+10!=end) {
name[i]=line[i+10];
i+=1;
}
name[i]=0;
}
int expand(char fname[]) {
FILE *f;
char buf[100];
char name[40];
int x;
// 주어진 파일이름으로 f를 읽기 파일로 연다.
f=fopen(fname, "r");
if(f==NULL) {
printf("파일 %s를 열수 없습니다.\n", fname);
return 0;
}
// 현재 파일의 끝이 날때 까지 계속하면서
while(!feof(f)) {
// 한줄을 읽는다.
fgets(buf, 100, f);
// 파일의 끝이 빈줄로 끝날때를 처리해준다.
if(strlen(buf)<1) { break; }
// expand를 해야할지 체크한다.
x=check(buf);
// expand를 해야하는 경우이다.
if(x>0) {
// 다음 파일이름을 구한다.
copy(name, buf, x);
// 재귀적으로 expand를 호출한다.
expand(name);
} else {
// 확장하는 줄이 아닌 줄은 바로 출력해 준다.
printf("%s", buf);
if(feof(f)) printf("\n");
}
// 파일의 끝이 빈줄로 끝날때를 처리해 주기 위해서이다.
buf[0]=0;
}
// 현재 파일을 닫는다.
fclose(f);
//printf("\n");
return 1;
}
int main() {
char buf[100];
printf("파일이름: ");
gets(buf);
expand(buf);
return 0;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
n보다 작은 소수 출력하기 (0) | 2013.10.26 |
---|---|
infix to postfix and eval (중위표현을 후위표현으로 바꾸고 값 구하기) (0) | 2013.10.26 |
가우스 조던 소거법 (0) | 2013.10.20 |
10진수를 2진수, 8진수, 16진수로 (0) | 2013.10.16 |
c언어 연산자의 이해 (0) | 2013.10.07 |