分享一个的c++写的,模仿awk的框架类CAwkDoc
这是我好多年前,模仿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
`
pragma once
include "AwkFunc.h"
class CAwkDoc;
class IAwkOneDualItr
{
public:
virtual int dualBegin(CAwkDoc &Doc) = 0;
//返回0代表正常,继续处理下一条 返回1代表退出文本处理直接到End阶段 返回-1代表处理出错,直接退出
virtual int dualOneLine(CAwkDoc &Doc) = 0;
virtual int dualEnd(CAwkDoc &Doc) = 0;
};
class CAwkOneDualItrBase:public IAwkOneDualItr
{
public:
virtual int dualBegin(CAwkDoc& Doc)
{
return 0;
}
virtual int dualEnd(CAwkDoc& Doc)
{
return 0;
}
};
class CAwkDoc
{
public:
typedef map<string, string> AwkMapType;
typedef vector AwkVecType;
public:
CAwkDoc(void);
CAwkDoc(IAwkOneDualItr* lineopr, const string& filepath);
virtual ~CAwkDoc(void);
virtual bool run();
void setFileName(const string& filepath)
{
m_filename = filepath;
}
void setDelimer(const string delimer)
{
m_delimer = delimer;
}
vector<string>& Parts()
{
return m_vecParts;
}
void setStrParam(const string& paramname, const string& paramvalue);
string& getStrParam(const string& paramname);
AwkVecType& getVecParam(const string& paramname);
AwkMapType& getMapParam(const string& paramname);
public:
int m_nf;
int m_nr;
string m_filename;
string m_line;
string m_delimer;
vector<string> m_vecParts;
map<string, string> m_strParams;
map< string, AwkMapType > m_mpParams;
map< string, AwkVecType > m_vecParams;
public:
IAwkOneDualItr *m_lineopr;
};
`
AwkBase.cpp
`
include "stdafx.h"
include "AwkBase.h"
CAwkDoc::CAwkDoc(void)
{
m_delimer = " ";
m_nf = m_nr = 0;
m_lineopr = NULL;
}
CAwkDoc::CAwkDoc(IAwkOneDualItr* lineopr, const string& filepath):
m_lineopr(lineopr), m_filename(filepath)
{
m_nf = m_nr = 0;
m_delimer = " ";
}
CAwkDoc::~CAwkDoc(void)
{
}
bool CAwkDoc::run()
{
//读取文件
string inparamStr = FileToString(m_filename);
//将文件分行
vector<string> vecLines;
SplitStr(inparamStr, "\n", vecLines);
if (vecLines.size() == 0)
{
cerr << "ERR: 文件(" << m_filename << ")为空或不存在!" << endl;
return false;
}
assert(m_lineopr != NULL);
m_lineopr->dualBegin(*this);
for (size_t i = 0; i < vecLines.size(); i++)
{
m_line = vecLines[i];
if (m_line == "")
{
continue;
}
//删除多余空格(为后面分割做准备)
string theline = m_line;
//constrictSpace(theline);
m_nr++;
m_nf = SplitStr(theline, m_delimer, m_vecParts);
if (m_vecParts.size() < 20)
{
m_vecParts.resize(20);
}
int ret = m_lineopr->dualOneLine(*this);
//1是正常结束 -1是异常结束
if ( ret == 1 )
{
break;
}
else if ( ret == -1 )
{
return false;
}
}
m_lineopr->dualEnd(*this);
return true;
}
void CAwkDoc::setStrParam(const string& paramname, const string& paramvalue)
{
m_strParams[paramname] = paramvalue;
}
string& CAwkDoc::getStrParam(const string& paramname)
{
return m_strParams[paramname];
}
`
分享一个的c++写的,模仿awk的框架类CAwkDoc的更多相关文章
- 分享一个手机端好用的jquery ajax分页类
分享一个手机端好用的jquery ajax分页类 jquery-ias.min.js 1,引入jquery-ias.min.js 2,调用ajax分页 <script type="te ...
- 分享一个14年写的用户管理类-swift版
AccountManager类 14年设计,从swift 0.9开始,迭代到现在swift4.0版本,总体几乎没什么改动,简单稳定. 其实现的思路主要还是借助之前net反射的经验,实现了自动保存用户信 ...
- 分享一个漂亮的ASP.NET MVC黑色界面框架
插件应用架构概述 基于LCLFramework插件框架的应用由以下三个部分构成: (1)主程序:针对特定应用环境(Web.WinForm等应用环境),加载启动插件,获取插件入口,运行入口程序. (2) ...
- 分享一个简单的C#的通用DbHelper类(支持数据连接池)
每次新项目的时候,都要从头去找一遍数据库工具类.这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池. 连接池配置 <connectionStrings> <add ...
- 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路
最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...
- 分享一个c#写的开源分布式消息队列equeue
分享一个c#写的开源分布式消息队列equeue 前言 equeue消息队列中的专业术语 Topic Queue Producer Consumer Consumer Group Broker 集群消费 ...
- 分享一个自己写的MVC+EF “增删改查” 无刷新分页程序
分享一个自己写的MVC+EF “增删改查” 无刷新分页程序 一.项目之前得添加几个组件artDialog.MVCPager.kindeditor-4.0.先上几个效果图. 1.首先建立一个数 ...
- [UWP]分享一个基于HSV色轮的调色板应用
1. 前言 上一篇文章介绍了HSV色轮,这次分享一个基于HSV色轮的调色板应用,应用地址:ColorfulBox - Microsoft Store 2. 功能 ColorfulBox是Adobe 色 ...
- 分享一个MySQL分库分表备份脚本(原)
分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...
随机推荐
- 安装pyspider出现的问题
本文来自微信公众号:coder_xiaobu,欢迎关注 一.安装pyspider pip install pyspider 二.启动 pyspider all 三.安装中出现的问题处理 安装的时候出现 ...
- C++编程指南(6-7)
六.函数设计 函数是C++/C程序的基本功能单元,其重要性不言而喻.函数设计的细微缺点很容易导致该函数被错用,所以光使函数的功能正确是不够的.本章重点论述函数的接口设计和内部实现的一些规则. 函数接口 ...
- csv 如何将txt文件转换成csv文件
import csvdef convert_txt_to_csv(out_file_path, input_file_path, txt_sep): #定义输出路径,输入文件路径,txt的分隔符 wi ...
- Scrum冲刺_Day07
一.团队展示: 1.项目:light_note备忘录 2.队名:删库跑路队 3.团队成员 队员(不分先后) 项目角色 黄敦鸿 后端工程师.测试 黄华 后端工程师.测试 黄骏鹏 后端工程师.测试 黄源钦 ...
- es6 数组新增方法
1.Array.from(): 这个函数的作用是将类似数组的对象转化为数组,比如DOM对象 let arrayLike = { "0":"TangSir&quo ...
- AcWing 322. 消木块
由于木块可以由一些木块的消除,使两边相同颜色的合并 所以我们设定一个归并方式,即每个区间记录一下右边的延展性. (等于左边找右边) 设 \(f[i][j][k]\) 为\([i, j]\) 区间,右侧 ...
- Spark3.0中Dates和Timestamps
Spark3.0使用的是预公历,而之前都是儒略历和公历的混合(即1582年之前的日期使用儒略历,1582年之后使用公历,java.sql.Date这个API用的就是这种,而Java8里使用java.t ...
- TLS 协议
一.背景 参与了一个Sofa-RPC开源项目,认领了TLS的任务,记录下这次宝贵的经历,并感谢章哥的信任以及在整个过程中对我的帮助. 负责的部分不难,主要是使用h2(HTTP 2加密)协议,完成RPC ...
- 面试 03-DOM事件的总结
03-DOM事件的总结 #前言 要学习事件的基础内容,请看先本人之前的基础文章: <04-JavaScript基础/27-事件对象Event> <04-JavaScript基础/28 ...
- TP学习第二天—
一.控制器和对应方法的创建 2.路由解析 传统的路由解析方法: 具体url地址模式设置(配置文件在 ThinkPHP/Conf/convertion.php) 停到了之前的 黑马传智的 TP课,换了个 ...