经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
分享一个的c++写的,模仿awk的框架类CAwkDoc
来源:cnblogs  作者:皇家救星  时间:2021/1/11 9:47:16  对本文有异议

这是我好多年前,模仿awk写的。
awk大家都比较熟悉,使用awk处理文件,读取文件,分割字段这些工作awk自己帮你实现了。
程序员只要编写业务逻辑代码,并且awk还提供了很多常用的字符串操作函数,可以方便地调用,所以使用起来很方便。
但awk脚本毕竟不适合开发复杂的逻辑,而且它提供的库函数也有限,不像c++,有很多第三方库可以调用。
于是我就想到了写一个框架类,把按行读文件,分割字段这些基本功能实现了,只留下业务逻辑供开发人员自由实现


这里用了策略模式,程序员把业务逻辑封装成为一个策略类(实现IAwkOneDualItr接口)传给CAwkDoc即可享受CAwkDoc提供的读文件功能。
最开始考虑过使用模板方法就行,但又担心继承CAwkDoc的程序员覆盖了它的实现,所以觉得还是策略方法好。


这是我之前用CAwkDoc实现的一个小工具:代码生成器https://github.com/kingstarer/kingstarer/tree/master/c%2B%2B/feepacker)
当年这个工具给项目组减轻了不少工作量,我同事们当时特别喜欢。
可惜项目现在早就凉了,不然这个工具估计还是在用:)
工具虽然早没用了,但这个代码生成器的思想(代码模板替换)我还是蛮喜欢的,前段时间搞java项目,写了一个curd代码生成器,还是套用了这个方法,使用代码模板思想。


分享一下CAwkDoc的主要代码

AwkBase.h

  1. #pragma once
  2. #include "AwkFunc.h"
  3. class CAwkDoc;
  4. class IAwkOneDualItr
  5. {
  6. public:
  7. virtual int dualBegin(CAwkDoc &Doc) = 0;
  8. //返回0代表正常,继续处理下一条 返回1代表退出文本处理直接到End阶段 返回-1代表处理出错,直接退出
  9. virtual int dualOneLine(CAwkDoc &Doc) = 0;
  10. virtual int dualEnd(CAwkDoc &Doc) = 0;
  11. };
  12. class CAwkOneDualItrBase:public IAwkOneDualItr
  13. {
  14. public:
  15. virtual int dualBegin(CAwkDoc& Doc)
  16. {
  17. return 0;
  18. }
  19. virtual int dualEnd(CAwkDoc& Doc)
  20. {
  21. return 0;
  22. }
  23. };
  24. class CAwkDoc
  25. {
  26. public:
  27. typedef map<string, string> AwkMapType;
  28. typedef vector<string> AwkVecType;
  29. public:
  30. CAwkDoc(void);
  31. CAwkDoc(IAwkOneDualItr* lineopr, const string& filepath);
  32. virtual ~CAwkDoc(void);
  33. virtual bool run();
  34. void setFileName(const string& filepath)
  35. {
  36. m_filename = filepath;
  37. }
  38. void setDelimer(const string delimer)
  39. {
  40. m_delimer = delimer;
  41. }
  42. vector<string>& Parts()
  43. {
  44. return m_vecParts;
  45. }
  46. void setStrParam(const string& paramname, const string& paramvalue);
  47. string& getStrParam(const string& paramname);
  48. AwkVecType& getVecParam(const string& paramname);
  49. AwkMapType& getMapParam(const string& paramname);
  50. public:
  51. int m_nf;
  52. int m_nr;
  53. string m_filename;
  54. string m_line;
  55. string m_delimer;
  56. vector<string> m_vecParts;
  57. map<string, string> m_strParams;
  58. map< string, AwkMapType > m_mpParams;
  59. map< string, AwkVecType > m_vecParams;
  60. public:
  61. IAwkOneDualItr *m_lineopr;
  62. };

AwkBase.cpp

  1. #include "stdafx.h"
  2. #include "AwkBase.h"
  3. CAwkDoc::CAwkDoc(void)
  4. {
  5. m_delimer = " ";
  6. m_nf = m_nr = 0;
  7. m_lineopr = NULL;
  8. }
  9. CAwkDoc::CAwkDoc(IAwkOneDualItr* lineopr, const string& filepath):
  10. m_lineopr(lineopr), m_filename(filepath)
  11. {
  12. m_nf = m_nr = 0;
  13. m_delimer = " ";
  14. }
  15. CAwkDoc::~CAwkDoc(void)
  16. {
  17. }
  18. bool CAwkDoc::run()
  19. {
  20. //读取文件
  21. string inparamStr = FileToString(m_filename);
  22. //将文件分行
  23. vector<string> vecLines;
  24. SplitStr(inparamStr, "\n", vecLines);
  25. if (vecLines.size() == 0)
  26. {
  27. cerr << "ERR: 文件(" << m_filename << ")为空或不存在!" << endl;
  28. return false;
  29. }
  30. assert(m_lineopr != NULL);
  31. m_lineopr->dualBegin(*this);
  32. for (size_t i = 0; i < vecLines.size(); i++)
  33. {
  34. m_line = vecLines[i];
  35. if (m_line == "")
  36. {
  37. continue;
  38. }
  39. //删除多余空格(为后面分割做准备)
  40. string theline = m_line;
  41. //constrictSpace(theline);
  42. m_nr++;
  43. m_nf = SplitStr(theline, m_delimer, m_vecParts);
  44. if (m_vecParts.size() < 20)
  45. {
  46. m_vecParts.resize(20);
  47. }
  48. int ret = m_lineopr->dualOneLine(*this);
  49. //1是正常结束 -1是异常结束
  50. if ( ret == 1 )
  51. {
  52. break;
  53. }
  54. else if ( ret == -1 )
  55. {
  56. return false;
  57. }
  58. }
  59. m_lineopr->dualEnd(*this);
  60. return true;
  61. }
  62. void CAwkDoc::setStrParam(const string& paramname, const string& paramvalue)
  63. {
  64. m_strParams[paramname] = paramvalue;
  65. }
  66. string& CAwkDoc::getStrParam(const string& paramname)
  67. {
  68. return m_strParams[paramname];
  69. }

原文链接:http://www.cnblogs.com/kingstarer/p/14257523.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号