漂亮的LinuxC注释转换器--(2.1)目录级联转换算法预备及S_ISXXX宏的定义与使用

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

一.序:
在上一篇中,已经实现了基本的C++注释风格到C的注释风格转换,这一篇做升级程序的算法预备工作,为其达到支持目录级联转换的要求作铺垫
二.需要的基本算法说明:
可以看到Linux C函数库手册里给出了许多文件及目录函数,读者可以参考这些资料,笔者将根据需求介绍这些函数,并且使用这些函数。
三.必要的系统函数的介绍
笔者之前阅读了目录遍历这篇博文,读者可以借鉴一下,但是笔者认为网络上的这些代码是不全的,有的甚至会诱导自己走弯路,笔者陷于鸿沟之中一两天,将目录级联转换的代码推倒重来了一次,才达到自己心目中的要求,建议各位按自己的思路来,也许写的更好。
1.getopt()


作  用:   用来分析命令行参数
头文件:    #include <unistd.h>
用  法:   int getopt(int argc, char * const argv[],
                  const char *optstring);
说  明:
optstring中的指定的内容的意义(例如getopt(argc, argv, "ab:c:de::");)
1.单个字符,表示选项,(如上例中的abcde各为一个选项)
2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。(如上例中的b:c:)
3 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(如上例中的e::,如果没有跟参数,则optarg = NULL)

为了达到可以用参数选择要进行单文件转换/目录级联转换,我选择了getopt函数。
2.opendir()

打开目录

这里写图片描述
3.mkdir()

建立目录
#include <sys/stat.h>
int mkdir(const char *path, mode_t mode);
注意:
mode为权限,0755即为linux下目录的默认权限:drwxr-xr-x

4.readdir()

建立目录

这里写图片描述
5.closedir()

关闭目录

这里写图片描述
6.lstat()

获取文件/目录的属性
#include <sys/types.h> 
#include <sys/stat.h>
#include <unistd.h>

int lstat(const char *path, struct stat *buf);

man 2 stat可以看到stat结构体是这样定义的

struct stat {
               dev_t     st_dev;     /* ID of device containing file */
               ino_t     st_ino;     /* inode number */
               mode_t    st_mode;    /* protection */
               nlink_t   st_nlink;   /* number of hard links */
               uid_t     st_uid;     /* user ID of owner */
               gid_t     st_gid;     /* group ID of owner */
               dev_t     st_rdev;    /* device ID (if special file) */
               off_t     st_size;    /* total size, in bytes */
               blksize_t st_blksize; /* blocksize for file system I/O */
               blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
               time_t    st_atime;   /* time of last access */
               time_t    st_mtime;   /* time of last modification */
               time_t    st_ctime;   /* time of last status change */
           };

7.realpath()
这里写图片描述
8.宏S_ISDIR()
很多文章上说它是函数,是不对的,linux内核中/usr/src/sys/sys/stat.h将其定义为宏,使用这个宏之前一定要先调用lstat函数,因为它的使用是这样的:

//如果是文件文件
    if(S_ISDIR(statbuf.st_mode) == 0)
    {}

这里写图片描述
和它类似的还有

S_ISLNK(st_mode):是否是一个连接.
S_ISREG(st_mode):是否是一个常规文件.
S_ISDIR(st_mode):是否是一个目录
S_ISCHR(st_mode):是否是一个字符设备.
S_ISBLK(st_mode):是否是一个块设备
S_ISFIFO(st_mode):是否 是一个FIFO文件.
S_ISSOCK(st_mode):是否是一个SOCKET文件

9.文件结束判断feof()
这里写图片描述
这里写图片描述
10.其次,还可以了解其他文件和目录相关的函数。
四.目录级联转换实现思路
1.大方向:需要转换的目录–>函数–>转换后存放的目录(以下简称最终目录)
2.要求:
类似cp命令,需要转换的文件是.c/.cpp文件,要达到以下要求:
(1)所有文件在最终目录中的相对路径要保持不变
(2)所有文件的属性不变
3.函数模型

void DirConvert(char *des, char *src);          //目录的递归转换
void BeginConvert(char *des, char *src);        //进行目录递归转换
(des为最终目录,src为源目录,即要进行转换的目录)

4.函数的作用:

void DirConvert(char *des, char *src);          //目录的递归转换
{
    //(1)参数检测
    //(2)打开des和src目录.若src不存在,则退出程序;若des不存在,则建立  
    //(3)读取src中的文件,调用BeginConvert函数,进行注释转换
    //(4)关闭des和src目录
}
void BeginConvert(char *des, char *src);        //进行目录递归转换
{
    //(1)将src,des的路径转化成绝对路径分别存于src_path,des_path中
    //(2)获取src的属性。
    //(3)分情况讨论
    //a.如果src是文件,判断是否是.c/.cpp文件,des_path追加这一文件,然后直接调动OneFileConvert()进行转换
    //b.如果src是目录,des_path追加这一目录,然后DirpConvert(des_path,src_path)

}

五.gdb调试介绍
笔者在编写的过程中,遇到了一些问题,比如未转换/只转换了一层目录,这一切都要通过调试解决,所以必须要学会gdb的带参数调试工作

(1)自行编写Makefile文件,编译工作:
make
如果要使用gdb,需要加-g参数,可以参考:
g++ convert.cpp -o convert -g
(2)调试:
gdb convert -g
(3)调试界面已经出现,开始调试,流程是:设置参数-->显示参数-->开始调试
set args -r ./tttttt ./t1
show args
b 20
r
s

可以参考gdb带参数调试

h5页面分享一(附源码) 1. 页面效果 2. index.html &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8" /&gt; &lt;title&gt;css网页布局&lt;/title&gt; &lt;link rel="stylesheet" href= 阅读详情

相关推荐

C++之多态的原理及其分析

文档下载(含图) 分析: 一.序言 C++ 中的虚函数的作用主要是实现了多态的机制。关于多态,说白了就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数(当然引用也可以达到该目的,引用也是指针的另一种变种)。这种技 术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚 函数技术

哒哒的博客 3738

S_ISLNK S_ISREG S_ISDIR S_ISCHR S_ISBLK S_ISFIFO S_ISSOCK等的介

stat函数讲解: 表头文件: #include &lt;sys/types.h&gt; #include &lt;sys/stat.h&gt; #include &lt;unistd.h&gt; 定义函数: int stat(const char *file_name, struct stat *buf); 函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体...

hzq_blog 2870

科技园区如何通过数智化提升招商项目评估精准度?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新产业创新智能化发展。

S_ISDIR()函数讲解

所需头文件 #include <sys/stat.h> S_ISDIR()函数的作用是判断一个路径是不是目录

afootball的博客 1万+

S_ISDIR(stat.sb_mode)函数功能

一般在之前都会先调用函数stat( FileName, &fp),意味着将FileName这个文件的信息保存到了地址fp中。此时fp.st_mode就是文件FileName的模式,所以S_ISDIR(fp.st_mode)的函数功能是判断fp所指向文件(也就是FileName)是否为目录(dir)类型。

qq_34707315的博客 4662

S_ISDIR()函数

S_ISDIR()函数 功能是判断一个路径是否为目录 在sys/stat.h中还定义了更多相关的函数 The following symbolic names for the values of type mode_t shall also be defined. File type: S_IFMT Type of file. S_IFBLK Block special.

嵌入小弱 2万+

C++中虚析构函数的作用及其原理分析

参考http://blog.csdn.net/xiamentingtao/article/details/55517203 C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数的作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内

哒哒的博客 6万+

realpath和access函数浅谈

在我所做项目中,用上了realpath和access函数,整理一下一.主要说明1.realpath函数 头文件: #include <limits.h> #include <stdlib.h>  函数原型:char *realpath(const char *path, char *resolved_path)   函数说明:realpath()用来将参数path所

哒哒的博客 1万+

错误的trim和正确的trim(C++)

trim函数用来去除一个字符串左右两边的空格和制表符err例1–>一个错误的trim函数展示string LaStrUtils::trim(const std::string& str) { string ret; //find the first position of not start with space or '\t' string::size_type pos1

哒哒的博客 2895

C++初级主题--名字空间域和类域

.序在C++中支持三种域:局部域、名字空间域和类域。二.名字空间域1.名字空间域是随标准C++而引入的。它相当于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字:namespace ns1{ float a,b,c; fun1(){……} … }花括号括起来的部分称声明块。声明块中可以包括:类、变量(带

哒哒的博客 2527

给一道关于const的面试题

/*题目:请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变 A.const int const *x = &y; B.int * const x = &y; C.const int *x = &y; D.const int * const x = &y; *///正确答案B 技巧: (1)const若在*的左边,则是内存中的值不可变 (2)const若在*的右边,则是所指向的内存地

哒哒的博客 1551

关于C++中的临时对象/常非常&左右值/的阐述

.先看一段话 局部对象在离开建立它的函数时就消亡了,不可能在返回调用函数后继续生存,所以在处理这种情况时,编译系统会在调用函数的表达式中创建一个无名临时对象,该临时对象的生存周期只在函数调用处的表达式中。所谓return 对象,实际上是调用拷贝构造函数把该对象的值拷入临时对象(对象初始化对象),最终返回的是临时对象。如果返回的是变量,处理过程类似,只是不调用构造函数。 二.阐述 1.无名对象

哒哒的博客 1465

函数realpath/mktemp/access/stat以及fsutils工具中的代码例子

项目见到了realpath和mktemp这两个函数,记录一下一点注意事项一.realpath1.函数模型NAME realpath - return the canonicalized absolute pathnameSYNOPSIS #include <limits.h> #include <stdlib.h> char *realpath(

哒哒的博客 1316

getopt用法说明

.函数模型#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; #include <

哒哒的博客 1098

C++初级主题--(6)赋值函数

.默认赋值函数的一般形式赋值语句其实是对“=”进行重载。 Test& operator=(const Test &t) { cout<<"赋值函数:"<<this<<"="<<&t<<endl; if(this != &t) data = t.data; return *this; }二.详解赋值函数赋

哒哒的博客 896

C++初级主题--(3)构造函数的作用

.序 构造函数有三个作用:构造对象、初始化对象、类型转换.Attention 1.构造对象 当调动构造函数时,毫无疑问将会有一个新的对象被构造出来 2.初始化对象类型转换 问题1:变量给对象赋值可取?#include<iostream> using namespace std; class Test { public: Test(int d = 0) : data(d)

哒哒的博客 843

C++问题小结--2.通过几个例子谈谈const*

const在C++里能够封锁参数,修饰函数,修饰返回值首先,清楚一个概念,比如说我们定义了一个char类型的指针char *p,那么,在这里,p是一个char *类型的指针。p指的是p指针的指向的地址,*p是这个指针的指向空间的内容。char *p = &i; //那么这里*p存的是这个i变量的值;下面让我们从几个例子入手理解const的位置放置的不同引起的含义的不同:int *p; const

哒哒的博客 825

方便又官方的字符串处理函数及内存函数的实现

1.介绍: 实现了字符串一些处理函数,如strlen/strcpy/strcmp/strcat/memset/memcpy/memcmp/memmove主要借鉴了linux内核的实现方法,其中strlen函数给出了不定义第三方变量实现的方法,详细的代码在我的github里,供大家借鉴/*实现各字符串处理的函数 **2016-11-24 */ #include<iostream> #include<

哒哒的博客 824
上一篇: 漂亮的LinuxC注释转换器--(1)实现注释转换
下一篇: 漂亮的LinuxC注释转换器--(2.2)目录级联转换最终实现
逐鹿之城
博客等级 码龄11年 240粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值