c·c++/c 프로그래밍

파일 expand

바로이순간 2013. 10. 25. 09:00

파일이름을 입력하면 그 파일에 포함된 확장지시어를 찾아서

순환적으로 파일을 확장하는 프로그램이다.


확장지시어는

#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;

}