先举个例子,假如有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 <stdio.h>
#include <string.h>
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<lv1;lv++) printf("%s\\",prs[lv]);
printf("%s\n",prs[lv1]);
break;//
}
L=strlen(ln2);
if (L>=1 && ln2[L-1]=='\n') ln2[L-1]=0;
lv2=GetLV(ln2);
if (lv2<=lv1) {
for (lv=0;lv<lv1;lv++) printf("%s\\",prs[lv]);
printf("%s\n",prs[lv1]);
}
strcpy(prs[lv2],ln2+lv2*4);
lv1=lv2;
}
}
fclose(f);
}
return 0;
}