(C源代码)全路径格式和树形视图格式之间来回转换的命令行工具

先举个例子,假如有6个txt文件

全路径格式 fp.txt (FullPath):
    C:\1.txt
    C:\1\21.txt
    C:\1\22.txt
    C:\1\2\31.txt
    C:\1\23.txt
    C:\2.txt
树形视图格式 tv.txt (TreeView):
    C:
        1.txt
        1
            21.txt
            22.txt
            2
                31.txt
            23.txt
        2.txt

以上两种格式表达的意思是完全一样的。

怎么才能在这两种格式之间随意转换呢?以下C源代码实现了命令行工具,可在这两种格式之间来回转换:

#include 
#include 
int r=0;
FILE *f;
#define MAXLEN 32000
char ln1[MAXLEN];
char prs[1000][MAXLEN];
char ln2[MAXLEN];
int L;
int lv;
int lv1;
int lv2;
char *p,*q;
int GetLV(char *ln) {
    int i;

    i=0;
    while (1) {
        if (' '!=ln[i]) break;//
        i++;
    }
    return i/4;
}
int main(int argc,char **argv) {
    if (argc<2) {
        fprintf(stderr,
            "FP2TV (FullPath<==>TreeView Converter)\n"
            "For example,\n"
            "fp.txt (FullPath):\n"
            "    C:\\1.txt\n"
            "    C:\\1\\21.txt\n"
            "    C:\\1\\22.txt\n"
            "    C:\\1\\2\\31.txt\n"
            "    C:\\1\\23.txt\n"
            "    C:\\2.txt\n"
            "tv.txt (TreeView):\n"
            "    C:\n"
            "        1.txt\n"
            "        1\n"
            "            21.txt\n"
            "            22.txt\n"
            "            2\n"
            "                31.txt\n"
            "            23.txt\n"
            "        2.txt\n"
            "Usage:\n"
            "    FP2TV fp.txt >tv.txt\n"
            "  or\n"
            "    FP2TV tv.txt -r >fp.txt\n"
        );
        return 1;
    }
    if (argc>=3) r=1;
    if (!r) {//FP2TV
        f=fopen(argv[1],"r");
        if (NULL==f) {
            fprintf(stderr,"Can not open file [%s]!\n",argv[1]);
            return 2;
        }
        while (1) {
            if (NULL==fgets(ln1,MAXLEN,f)) break;//
            L=strlen(ln1);
            if (L>=1 && ln1[L-1]=='\n') ln1[L-1]=0;
            lv1=0;
            p=ln1;
            while (1) {
                q=strchr(p,'\\');
                if (NULL==q) {
                    printf("%*s%s\n",4*lv1,"",p);
                    break;//
                } else {
                    q[0]=0;
                    sprintf(prs[lv1],"%s",p);
                    printf("%*s%s\n",4*lv1,"",p);
                    lv1++;
                    if (lv1>=1000) break;//
                    p=q+1;
                }
            }
            if (lv1>=1000) {
                printf("Path level>=1000, Exit!\n");
                break;//
            }
            while (1) {
                if (NULL==fgets(ln2,MAXLEN,f)) break;//
                L=strlen(ln2);
                if (L>=1 && ln2[L-1]=='\n') ln2[L-1]=0;
                lv2=0;
                p=ln2;
                while (1) {
                    q=strchr(p,'\\');
                    if (NULL==q) {
                        printf("%*s%s\n",4*lv2,"",p);
                        break;//
                    } else {
                        q[0]=0;
                        if (strcmp(p,prs[lv2])) {
                            sprintf(prs[lv2],"%s",p);
                            printf("%*s%s\n",4*lv2,"",p);
                            for (lv=lv2+1;lv<1000;lv++) prs[lv][0]=0;
                        }
                        lv2++;
                        if (lv2>=1000) break;//
                        p=q+1;
                    }
                }
            }
            if (lv2>=1000) {
                printf("Path level>=1000, Exit!\n");
                break;//
            }
        }
        fclose(f);
    } else {//r==1 TV2FP
        f=fopen(argv[1],"r");
        if (NULL==f) {
            fprintf(stderr,"Can not open file [%s]!\n",argv[1]);
            return 2;
        }
        while (1) {
            if (NULL==fgets(ln1,MAXLEN,f)) break;//
            L=strlen(ln1);
            if (L>=1 && ln1[L-1]=='\n') ln1[L-1]=0;
            lv1=GetLV(ln1);
            strcpy(prs[lv1],ln1);
            while (1) {
                if (NULL==fgets(ln2,MAXLEN,f)) {
                    for (lv=0;lv=1 && ln2[L-1]=='\n') ln2[L-1]=0;
                lv2=GetLV(ln2);
                if (lv2<=lv1) {
                    for (lv=0;lv

你可能感兴趣的:(c语言,算法,开发语言)