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

news/2025/2/24 21:47:01

先举个例子,假如有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;
}


http://www.niftyadmin.cn/n/5864827.html

相关文章

AI赋能的未来城市:如何用智能化提升生活质量?

这会是我们憧憬的未来城市吗&#xff1f; 随着技术的不断进步和城市化进程的加速&#xff0c;现代城市面临着诸多挑战——交通拥堵、环境污染、能源消耗、人口老龄化等问题愈发突出。为了应对这些挑战&#xff0c;建设智慧城市已成为全球发展的重要趋势。在这一进程中&#xf…

【代码软件 | vs2019】vs2019+Qt5.12.12开发环境 的下载、安装详细介绍

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

开源软件的版权保护措施

开源软件的版权保护措施主要有以下几方面&#xff1a; 著作权保护 明确版权归属与许可使用&#xff1a;开源软件的源代码是著作权法保护的对象&#xff0c;作者享有复制权、发行权、改编权等专有权益。通过开源协议&#xff0c;作者明确授权用户使用、复制和修改软件&#xf…

深入理解P2P网络架构与实现

P2P结构基础讲解大纲 P2P结构概述 P2P的定义与特点P2P与客户端-服务器结构的区别P2P的应用场景 P2P网络架构 去中心化与分布式节点与连接P2P通信协议网络拓扑优缺点分析 P2P协议与技术实现 介绍常见的P2P协议&#xff08;如BitTorrent&#xff09;P2P协议中的数据传输机制基于…

JS复习练习题目、完整nodejs项目以及Commons、Es

### JS复习练习 - ![20250220204925](/up-z0.qiniup.com20250220204925.png) 1. 任务1&#xff1a;创建一个简单的问候函数 - 编写一个函数greet&#xff0c;接受一个名字作为参数&#xff0c;并返回一个问候语&#xff0c;例如&#xff1a;“Hello, [名字]! Welcome to Jav…

代码审计初探

学会了基础的代码审计后&#xff0c;就该提高一下了&#xff0c;学一下一些框架的php代码审计 先从一些小众的、已知存在漏洞的cms入手 phpems php的一款开源考试系统 源码下载 https://down.chinaz.com/soft/34597.htm 环境部署 windows审计&#xff0c;把相关文件放到phps…

开源一个可以调RGB三色的小灯棒子

开源一个可以调灯的小灯棒子。 主控用的STC8G1K08A-SOP8&#xff0c;RGB三色灯是WS2812B。 开源到立创开源广场了&#xff0c;可以直接进入下方链接&#xff0c;那边可以直接查看原理图和PCB。 一个可调RGB三色的小灯棒子 - 立创开源硬件平台一个可调RGB三色的小灯棒子https…

申请SSL证书,如何完成域名验证

一、前言 给大家分享一下Lets Encrypt 证书申请时&#xff0c;如何完成域名验证这一步操作的方法。 二、为什么要进行域名验证 申请SSL证书时进行域名验证的主要原因是确保证书只颁发给有权控制特定域名的实体。这是为了保证互联网的安全性和信任&#xff0c;防止恶意方获取不…