[开源/进行中直播] 一个生成.c/.h文件的小工具,c++写的

辛昕   2014-7-2 22:36 楼主
写程序的时候,我们经常要为一个模块生成一对 对应的 xxx.c / xxx.h 的 源文件。
还有一些常规的工作,比如 xxx.c里往往要 include  xxx.h

而xxx.h里通常要有一组防止重复包含的 #ifndef   #define #endif 的 条件编译。

这样的都是小事,而且工作量也不算多,只是,干多了就麻烦
——一个好的程序,其实可以分很多模块。
每分一个,就几乎有一对这样的文件,多了也就麻烦。

身为程序员,应该让更多的事情自动进行,减少重复自己(DRY原则 Do not Repeat Yourself)
其实很早以前我就想到这个东西,但一直懒散。

这次就写好了这个东西,毕竟真的不难,文件操作虽然我缺乏足够的操作。但终归不是多难的事情。

当然这个东西我大概在一个月以前左右就做好了。只是一直没时间整理发表上来。

现在发上来了。
首先贴出 生成好的exe工具。

大家用的时候,只需遵循以下命名原则就好了。

目前来说,做这个东西,还是比较粗糙。
对名字,主要问题在于 不知道如何让程序区分 名字里的单词成分。

比如说,一个模块,是用来生成某个数据块的。 我一般会命名 createXData 但有时我也可能命名为 CreateXdata
不一而足。

但是让程序,它没办法知道,是的,你没办法知道 你白丁的起名习惯,也不知道我辛昕不同时候面对不同名字组成成分会有很微妙的区别。

所以后来我综合了一个比较一般的原则,能满足大多数时候的规则,而如果最后实在不满意,我们最多也只不过是稍稍简单修改名字就好了。

不可能100%满足,但能80%,甚至哪怕60%我都很满足了!

这个程序的产生名字规则如下

_DATA_EXPLAIN_ 则会生成 DataExplain.c DataExplain.h
关键在于用 下划线 区分单词组成,然后首字母大写。

至于你写成 _Data_Explain_ 还是 _data_Explain_ 那都是无所谓的。

好了,先上 exe 然后回帖上代码,因为代码很短,所以直接上~~在下面的楼层里。

AutoCreateSourceFile.rar (247.31 KB)
(下载次数: 28, 2014-7-2 22:35 上传)


AutoCreateSourceFile.rar (247.31 KB)
(下载次数: 28, 2014-7-2 22:35 上传)




强者为尊,弱者,死无葬身之地

回复评论 (12)

首先是main函数

  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. using namespace std;

  5. #include <stdlib.h>
  6. #include <string.h>

  7. #include "NameInput.h"
  8. #include "createFile.h"

  9. /*
  10.         现在的问题,应该是
  11.         string类型,为什么非要我执行一次 对元素的操作,才不会出错呢?
  12.         也许,涉及了 类 的一些操作,如赋值操作 的什么还不懂的细节。待查
  13. */
  14. int main(int argc, char** argv)
  15. {               
  16.         fstream file;
  17.         string NAME;
  18.         string name;
  19.    
  20.     NAME = getNAME();
  21.    
  22.     char just = NAME[0];
  23.                     
  24.         name = getFileName(NAME);
  25.        
  26.     createSourceFile(name);
  27.     createHeadFile(NAME,name);
  28.    
  29.         return 0;
  30. }


关于函数前的这段注释,大概源于我写过程中的一些奇怪的现象所致。
按照逻辑来说,应该没有这种奇怪的现象,所以大概我是犯了什么疏忽,我过后得找机会搞清楚
强者为尊,弱者,死无葬身之地
点赞  2014-7-2 22:39
然后是 NameInput.c 模块
  1. #ifndef _NAME_INPUT_
  2. #define _NAME_INPUT_
  3. #include <string>
  4. #include <iostream>
  5. using namespace std;
  6. string getNAME(void);
  7. #endif
  1. #include "NameInput.h"
  2. #include <stdio.h>
  3. string getNAME(void)
  4. {
  5. string NAME;
  6. NAME.clear();
  7. cout<<"give me a name:"<<endl;
  8. cin>>NAME;
  9. return NAME;
  10. }
本帖最后由 辛昕 于 2014-7-2 22:41 编辑
强者为尊,弱者,死无葬身之地
点赞  2014-7-2 22:40
然后是关键的 CreateFile.c

  1. #ifndef _CREATE_FILE_
  2. #define _CREATE_FILE_

  3. #include <string>
  4. #include <iostream>
  5. #include <fstream>

  6. using namespace std;

  7. void createSourceFile(string name);
  8. void createHeadFile(string NAME,string name);

  9. string getFileName(string buff);

  10. #endif

  1. #include "createFile.h"
  2. #include <string.h>

  3. void createSourceFile(string name)
  4. {
  5.         fstream file;
  6.         string SourceName = name + ".c";
  7.                
  8.         file.open(SourceName.c_str(),ios::out);
  9.         if(file.is_open() == true)
  10.         {
  11.                 file<<"#include "<<"""<<name<<".h"<<"""<<endl;
  12.                 file<<endl;
  13.                 file<<"// end of file -------------------"<<endl;
  14.                 file<<endl;
  15.                 file.close();
  16.         }
  17. }

  18. void createHeadFile(string NAME,string name)
  19. {
  20.         fstream file;
  21.         string HeadName = name + ".h";
  22.    
  23.         file.open(HeadName.c_str(),ios::out);
  24.         if(file.is_open() == true)
  25.         {
  26.                 file<<"#ifndef "<<NAME.c_str()<<endl;
  27.                 file<<"#define "<<NAME.c_str()<<endl;
  28.                 file<<endl;
  29.                 file<<"#endif"<<endl;
  30.                 file<<endl;
  31.                 file<<"// end of file ------------------"<<endl;
  32.                 file<<endl;
  33.                
  34.                 file.close();
  35.         }               
  36. }

  37. string NameLower(char *buff)
  38. {
  39.         string lower;
  40.         lower.clear();
  41.        
  42.         if(buff == NULL)
  43.                 return lower;
  44.                
  45.         lower.push_back(buff[0]);
  46.        
  47.         if(strlen(buff) > 1)
  48.         {
  49.                 for(int i = 1;i < strlen(buff);i++)
  50.                         lower.push_back(tolower(buff[i]));
  51.         }
  52.        
  53.         return lower;       
  54. }

  55. string getFileName(string buff)
  56. {
  57.         char *pstr = NULL;
  58.         string name;
  59.         name.clear();
  60.        
  61.         pstr = strtok((char *)(buff.c_str()),"_");
  62.         if(pstr != NULL)
  63.                  name.append(NameLower(pstr));
  64.        
  65.         while(pstr != NULL)
  66.         {
  67.                 pstr = strtok(NULL,"_");
  68.                 if(pstr != NULL)
  69.                         name.append(NameLower(pstr));
  70.         }
  71.        
  72.         return name;
  73. }


  74. // end of file -------------------------------------------------------




强者为尊,弱者,死无葬身之地
点赞  2014-7-2 22:41
试了一下 确实不错 但是Ctrl+C Crtl+V也差不多
专业从事于在线监测振动、转速、轴振动、位移等,设备管理及故障检测振动诊断系统在线监测点巡检系统-现场动平衡仪-测振仪、便携式测振仪
点赞  2014-7-3 16:41

6楼 CDU 

要是版主再加点“/***Private Define***/”之类的分类就更好了
点赞  2014-7-3 18:46
引用: CDU 发表于 2014-7-3 18:46
要是版主再加点“/***Private Define***/”之类的分类就更好了

呵呵,我恰恰是最不喜欢这类 无用的 注释的。

对于注释,我和代码一样
没用的,一句都不留。

强者为尊,弱者,死无葬身之地
点赞  2014-7-3 23:22
顶起!!!!!!!!!!!!!!!
点赞  2014-7-4 10:02

9楼 CDU 

引用: 辛昕 发表于 2014-7-3 23:22
呵呵,我恰恰是最不喜欢这类 无用的 注释的。

对于注释,我和代码一样

这些注释还是有用吧,把宏定义和变量等分开,既整洁,别人也好阅读理解啊。可能还是看个人爱好吧
点赞  2014-7-4 10:39
引用: CDU 发表于 2014-7-4 10:39
这些注释还是有用吧,把宏定义和变量等分开,既整洁,别人也好阅读理解啊。可能还是看个人爱好吧

举个例子说吧
ST库里就有很多你说的这类

/* private variable...........*/
/* include file ..........*/

它们既不是 版本,版权说明,起法律声明作用。
又不是本模块对外的接口说明或者对内的实现说明。

要区分 宏定义 变量,说实话,看一眼就知道了的事情还要再来一句

/* macro defines here*/  吗?
这不是很多余吗?

我看到这些横插的注释的时候只觉得头疼,没觉得有什么整洁。

这的确与个人习惯,爱好关系密切,不强求。

我很崇尚 代码大全 的 作者 Steve Connell对此的一句话

任何注释或者说外观的选择,前提都要以不给维护,阅读造成麻烦,困难为前提。
因为这是一个非常主观的问题,因此,我个人认为这个观点是非常中肯的。

所以,每一次我自己整理别人的代码的时候,我总是把这些一概删除干净的。


强者为尊,弱者,死无葬身之地
点赞  2014-7-4 11:05
刚自己坑了自己一把
发现这个小工作 还有一个地方 很危险。

假如说你不小心再次创建 同名 文件,会把原来的文件内容 去掉!!

这个实在是祸害,一定要收拾掉!!

同时希望各位也多多提供反馈,bug啥的。
强者为尊,弱者,死无葬身之地
点赞  2014-7-8 00:05
关注一下
点赞  2014-7-28 20:36
顶起                                   
点赞  2014-8-3 21:24
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复