文章目录

  • 1._public.h
  • 2._public.cpp
  • 3._cmpublic.h

1._public.h

#ifndef _PUBLIC_H
#define _PUBLIC_H 1
#include "_cmpublic.h"
//全路径文件名,大小,时间的结构体
struct st_fileinfo
{char filename[301];int  filesize;char mtime[21];
};//1111111111111111111.读取某目录下的全部的文件
class CDir
{public:char m_DirName[301];         // 目录名char m_FileName[301];        // 文件名,不包括目录名char m_FullFileName[301];    // 文件全名,包括目录名int  m_FileSize;             // 文件的大小char m_ModifyTime[21];       // 文件最后一次被修改的时间char m_CreateTime[21];       // 文件生成的时间char m_AccessTime[21];       // 文件最后一次被访问的时间int m_uPOS;                 // 已读取m_vFileName容器的位置vector<string> m_vFileName;  //  存放OpenDir方法获取到的文件列表CDir();// 变量初始化void initdata();// 设置日期时间的格式,支持"yyyy-mm-dd hh24:mi:ss"和"yyyymmddhh24miss"两种格式,缺省是前者char m_DateFMT[21];void SetDateFMT(const char *in_DateFMT);// 打开目录,获取文件名信息,存放于m_vFileName容器中// in_DirName,待打开的目录名// in_MatchStr,待获取文件名的匹配规则// in_MaxCount,获取文件的最大数量// bAndChild,是否打开各级子目录// bSort,是否对结果集进行排序bool OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount=10000,const bool bAndChild=false,bool bSort=false);// 这是一个递归函数,用于OpenDir()的调用。bool _OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild);// 逐个读取目录中的文件信息bool ReadDir();~CDir();
};//111111111111111111112.STRCPY、STRNCPY、STRCAT、STRNCAT四个函数,弥补库函数的缺陷
// 以后可以用这四个函数取代strcpy、strncpy、strcat、strncat
// 函数的第二个参数是第一个参数dest有效长度,即占用内存的字节数-1。
// 该系列函数解决三个问题:1)变量初始化;2)内存溢出;3)修复strncpy的缺陷。
char *STRCPY(char* dest,const size_t destlen,const char* src);
char *STRNCPY(char* dest,const size_t destlen,const char* src,size_t n);
char *STRCAT(char* dest,const size_t destlen,const char* src);
char *STRNCAT(char* dest,const size_t destlen,const char* src,size_t n);int SNPRINTF(char *str, size_t size, const char *fmt, ...);// 把整数的时间转换为字符串格式的时间,格式如:"2019-02-08 12:05:08",如果转换成功函数返回0,失败返回-1,函数的声明如下:
int timetostr(const time_t ti,char *strtime);// 把字符串格式的时间转换为整数的时间,函数的声明如下:
int strtotime(const char *strtime,time_t *ti);// 从文件文件中读取一行
// strEndStr是一行数据的结束标志,如果为空,则以换行符"\n"为结束标志。
// 本函数不会删除行的结束标志
bool FGETS(const FILE *fp,char *strBuffer,const int ReadSize,const char *strEndStr=0);//11111111111111111111113.文件操作类声明
class CFile
{private:FILE *m_fp;        // 文件指针bool  m_bEnBuffer; // 是否启用缓冲区,true-启用;false-不启用char  m_filename[301]; // 文件名char  m_filenametmp[301]; // 临时文件名public:CFile();   // 类的构造函数~CFile();   // 类的析构函数bool IsOpened();  // 判断文件是否已打开// 打开文件,参数与fopen相同,打开成功true,失败返回false          bool Open(const char *filename,const char *openmode,bool bEnBuffer=true);// 关闭文件指针,并删除文件bool CloseAndRemove();// 专为改名而创建文件,参数与fopen相同,打开成功true,失败返回false          // 函数将会创建filename后加.tmp的临时文件,调用CloseAndRename()后才把临时文件改名为正式文件bool OpenForRename(const char *filename,const char *openmode,bool bEnBuffer=true);// 关闭文件并改名bool CloseAndRename();// 调用fprintf向文件写入数据void Fprintf(const char *fmt, ... );// 调用fgets从文件中读取一行,bDelCRT=true删除换行符,false不删除,缺省为falsebool Fgets(char *strBuffer,const int ReadSize,bool bDelCRT=false);// 从文件文件中读取一行// strEndStr是一行数据的结束标志,如果为空,则以换行符"\n"为结束标志。// 与Fgets不同,本函数不删除结束标志bool FFGETS(char *strBuffer,const int ReadSize,const char *strEndStr=0);// 调用fread从文件中读取数据size_t Fread(void *ptr,size_t size);// 调用fwrite向文件中写数据size_t Fwrite(const void *ptr,size_t size);// 关闭文件指针,如果存在临时文件,就删除它。void Close();
};//1111111111111111111111111111114.拆分字符串的类
// 字符串的格式为:内容1+分隔字符串+内容2+分隔字符串+内容3
// 如:num~!~name~!~address,分隔符为"~!~"
class CCmdStr
{public:vector<string> m_vCmdStr;  // 存放拆分后的字段内容。CCmdStr();// 拆分字符串到容器中void SplitToCmd(const string in_string,const char *in_sep,const bool bdeletespace=true);int CmdCount();// 获取字段的值,取每个字段的值inum从0开始bool GetValue(const int inum,char   *in_return);bool GetValue(const int inum,char   *in_return,const int in_len);bool GetValue(const int inum,int    *in_return);bool GetValue(const int inum,long   *in_return);bool GetValue(const int inum,double *in_return);~CCmdStr();
};// 删除字符串左边指定的字符
void DeleteLChar(char *in_string,const char in_char);// 删除字符串右边指定的字符
void DeleteRChar(char *in_string,const char in_char);// 删除字符串两边指定的字符
void DeleteLRChar(char *in_string,const char in_char);//11111111111111111115.取操作系统的时间
/*out_stime是输出结果in_interval是偏移常量,单位是秒返回的格式由fmt决定,fmt目前的取值如下,如果需要,可以增加:yyyy-mm-dd hh:mi:ss,此格式是缺省格式,长度为19yyyymmddhhmissyyyy-mm-ddyyyymmddhh:mi:sshhmisshh:mihhmihhmi
*/
void LocalTime(char *out_stime,const char *in_fmt=0,const int in_interval=0);//日志文件操作类
#define MAXLOGFSIZE 100    // 日志文件切换的大小
// 日志文件操作类
class CLogFile
{public:FILE   *m_tracefp;           // 日志文件指针char    m_filename[301];     // 日志文件全名char    m_openmode[11];      // 日志文件的打开方式bool    m_bBackup;           // 日志文件超出MAXLOGFSIZE,是否自动备份bool    m_bEnBuffer;         // 写入日志时,是否启用操作系统的缓冲机制CLogFile();// filename日志文件名// openmode打开文件的方式,操作日志文件的权限,同打开文件函数(fopen)使用方法一致,一般采用"a+"// bBackup,true-备份,false-不备份,在多进程的服务程序中,如果多个进行共用一个日志文件,bBackup必须为false// bEnBuffer:true-启用缓冲区,false-不启用缓冲区,如果启用缓冲区,那么写进日志文件中的内容不会立即写入文件// 注意,bEnBuffer参数的值如果设置为true,可能会导致日志文件内容不完整。bool Open(const char *in_filename,const char *in_openmode,bool bBackup=true,bool bEnBuffer=false);// 如果日志文件大于100M,就备份它// 备份后的文件会在源文件名后加上日期时间// 注意,在多进程程序中,日志文件不可切换,多线程程序中,日志文件可切换。bool BackupLogFile();// 写日志文件,它是个可变参数的方法,同printf函数。// Write()方法会写入时间,WriteEx()方法不写时间。bool Write(const char *fmt,...);bool WriteEx(const char *fmt,...);// 关闭日志文件void Close();~CLogFile();
};// 关闭全部的信号和输入输出
void CloseIOAndSignal();// 用某文件或目录的全路径中的目录创建目录,以及该目录下的各级子目录
// pathorfilename 目录名或文件名
// bisfilename true-pathorfilename是文件名,否则是目录名
bool MKDIR(const char *pathorfilename,bool bisfilename=true);// 删除文件,如果删除失败,会尝试in_times次
bool REMOVE(const char *in_filename,const int in_times=3);// 把in_srcfilename改名为in_dstfilename,如果改名失败,会尝试in_times次
bool RENAME(const char *in_srcfilename,const char *in_dstfilename,const int in_times=3);// 把某一个文件复制到另一个文件
bool COPY(const char *srcfilename,const char *dstfilename);// 调用fopen函数打开文件,如果文件名中包含的目录不存在,就创建目录
FILE *FOPEN(const char *filename,const char *mode);// 获取文件的大小,返回字节数
int FileSize(const char *in_FullFileName);// 获取文件的时间,即modtime
void FileMTime(const char *in_FullFileName,char *out_ModTime);// 更改文件的修改时间属性,mtime指定了时间,格式不限,只要包括了yyyy,mm,dd,hh24,mi,ss即可。
int UTime(const char *filename,const char *mtime);// 把字符串格式的时间转换为time_t
// stime为输入的时间,格式不限,但一定要包括yyyymmddhh24miss
time_t UTCTime(const char *stime);// 从一个字符串中提取数字、符号和小数点,并判断是否是一个合法的数
// 如果不合法,将返回空字符串
// bWithSign==true表示包括符号,bWithDOT==true表示包括圆点
void PickNumber(const char *strSrc,char *strDst,const bool bWithSign,const bool bWithDOT);// 判断字符串中的负号和圆点是否合法
bool JudgeSignDOT(const char *strSrc,const char *strBZ);/*把一个字符串表格的时间加上一个偏移量,得到偏移后的时间in_stime是传入的时间,任意格式,但是一定要包括yyyymmddhh24miss,是否有分隔符没有关系。把yyyy-mm-dd hh24:mi:ss偏移in_interval秒传出的格式由fmt决定,fmt目前的取值如下,如果需要,可以增加:yyyy-mm-dd hh24:mi:ss(此格式是缺省格式)yyyymmddhh24missyyyymmddhh24missyyyy-mm-ddyyyymmddhh24:mi:sshh24misshh24:mihh24mi返回值:0-成功,-1-失败。
*/
int AddTime(const char *in_stime,char *out_stime,const int in_interval,const char *in_fmt=0);//1111111111111111111111116.以下是XML格式字符串的相关操作函数和类
// 操作XMLBuffer的函数
// in_XMLBuffer,XML格式的字符串,如下:
// <filename>/tmp/readme.txt</filename><mtime>2018-01-01 12:20:35</mtime><size>10241</size>
// in_FieldName,字段的标签名
// out_Value,获取内容存放的变量的指针
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,bool   *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,int    *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,unsigned int *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,long   *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,unsigned long *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,double *out_Value);
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,char   *out_Value,const int in_StrLen=0);//11111111111111111111111117.判断文件名是否匹配in_MatchStr指定的规则
// in_FileName文件名
// in_MatchStr规则表达式,如"*.txt,*.xml",中间用逗号分隔
bool MatchFileName(const string in_FileName,const string in_MatchStr);// 把小写转换成大写,忽略不是字母的字符
void ToUpper(char *str);
void ToUpper(string &str);// 把大写转换成小写,忽略不是字母的字符
void ToLower(char *str);
void ToLower(string &str);// 字符串替换函数
// 把in_string中的in_str1替换为in_str2
// bLoop是否循环执行替换
// 注意
// 1、如果in_str2比in_str1要长,替换后in_string会变长,所以必须保证in_string有足够的长度, 否则内存会溢出
// 2、如果in_str2中包函了in_str1的内容,且bLoop为true,就会进入死循环,最终导致内存溢出
void UpdateStr(char *in_string,const char *in_str1,const char *in_str2,bool bLoop=true);//111111111111111111111118.以下是TCP/IP通讯的函数和类
// socket通信的客户端类
class CTcpClient
{public:int  m_sockfd;    // 客户端的socket.char m_ip[21];    // 服务端的ip地址。int  m_port;      // 与服务端通信的端口。bool m_state;     // 与服务端的socket连接状态。bool m_btimeout;  // 调用Read和Write方法时,失败的原因是否是超时:true-未超时,false-已超时。int  m_buflen;    // 调用Read方法后,接收到的报文的大小,单位:字节。CTcpClient();  // 构造函数。// 向服务端发起连接请求。// ip:服务端的ip地址。// port:服务端监听的端口。// 返回值:true-成功;false-失败。bool ConnectToServer(const char *ip,const int port);// 接收服务端发送过来的数据。// buffer:接收数据缓冲区的地址,数据的长度存放在m_buflen成员变量中。// itimeout:等待数据的超时时间,单位:秒,缺省值是0-无限等待。// 返回值:true-成功;false-失败,失败有两种情况:1)等待超时,成员变量m_btimeout的值被设置为true;2)socket连接已不可用。bool Read(char *buffer,const int itimeout=0);// 向服务端发送数据。// buffer:待发送数据缓冲区的地址。// ibuflen:待发送数据的大小,单位:字节,缺省值为0,如果发送的是ascii字符串,ibuflen取0,如果是二进制流数据,ibuflen为二进制数据块的大小。// 返回值:true-成功;false-失败,如果失败,表示socket连接已不可用。bool Write(const char *buffer,const int ibuflen=0);// 断开与服务端的连接void Close();~CTcpClient();  // 析构函数自动关闭socket,释放资源。
};// socket通信的服务端类
class CTcpServer
{private:int m_socklen;                    // 结构体struct sockaddr_in的大小。struct sockaddr_in m_clientaddr;  // 客户端的地址信息。struct sockaddr_in m_servaddr;    // 服务端的地址信息。
public:int  m_listenfd;   // 服务端用于监听的socket。int  m_connfd;     // 客户端连接上来的socket。bool m_btimeout;   // 调用Read和Write方法时,失败的原因是否是超时:true-未超时,false-已超时。int  m_buflen;     // 调用Read方法后,接收到的报文的大小,单位:字节。CTcpServer();  // 构造函数。// 服务端初始化。// port:指定服务端用于监听的端口。// 返回值:true-成功;false-失败,一般情况下,只要port设置正确,没有被占用,初始化都会成功。bool InitServer(const unsigned int port); // 阻塞等待客户端的连接请求。// 返回值:true-有新的客户端已连接上来,false-失败,Accept被中断,如果Accept失败,可以重新Accept。bool Accept();// 获取客户端的ip地址。// 返回值:客户端的ip地址,如"192.168.1.100"。char *GetIP();// 接收客户端发送过来的数据。// buffer:接收数据缓冲区的地址,数据的长度存放在m_buflen成员变量中。// itimeout:等待数据的超时时间,单位:秒,缺省值是0-无限等待。// 返回值:true-成功;false-失败,失败有两种情况:1)等待超时,成员变量m_btimeout的值被设置为true;2)socket连接已不可用。bool Read(char *buffer,const int itimeout);// 向客户端发送数据。// buffer:待发送数据缓冲区的地址。// ibuflen:待发送数据的大小,单位:字节,缺省值为0,如果发送的是ascii字符串,ibuflen取0,如果是二进制流数据,ibuflen为二进制数据块的大小。// 返回值:true-成功;false-失败,如果失败,表示socket连接已不可用。bool Write(const char *buffer,const int ibuflen=0);// 关闭监听的socket,即m_listenfd,常用于多进程服务程序的子进程代码中。void CloseListen();// 关闭客户端的socket,即m_connfd,常用于多进程服务程序的父进程代码中。void CloseClient();~CTcpServer();  // 析构函数自动关闭socket,释放资源。
};// 接收socket的对端发送过来的数据。
// sockfd:可用的socket连接。
// buffer:接收数据缓冲区的地址。
// ibuflen:本次成功接收数据的字节数。
// itimeout:接收等待超时的时间,单位:秒,缺省值是0-无限等待。
// 返回值:true-成功;false-失败,失败有两种情况:1)等待超时;2)socket连接已不可用。
bool TcpRead(const int sockfd,char *buffer,int *ibuflen,const int itimeout=0);// 向socket的对端发送数据。
// sockfd:可用的socket连接。
// buffer:待发送数据缓冲区的地址。
// ibuflen:待发送数据的字节数,如果发送的是ascii字符串,ibuflen取0,如果是二进制流数据,ibuflen为二进制数据块的大小。
// 返回值:true-成功;false-失败,如果失败,表示socket连接已不可用。
bool TcpWrite(const int sockfd,const char *buffer,const int ibuflen=0);// 从已经准备好的socket中读取数据。
// sockfd:已经准备好的socket连接。
// buffer:接收数据缓冲区的地址。
// n:本次接收数据的字节数。
// 返回值:成功接收到n字节的数据后返回true,socket连接不可用返回false。
bool Readn(const int sockfd,char *buffer,const size_t n);// 向已经准备好的socket中写入数据。
// sockfd:已经准备好的socket连接。
// buffer:待发送数据缓冲区的地址。
// n:待发送数据的字节数。
// 返回值:成功发送完n字节的数据后返回true,socket连接不可用返回false。
bool Writen(const int sockfd,const char *buffer,const size_t n);//111111111111111111119.这是一个精确到微秒的计时器
class CTimer
{public:struct timeval m_start,m_end;CTimer();// 开始计时void Start();// 计算已逝去的时间,单位:秒,小数点后面是微秒double Elapsed();
};#endif

2._public.cpp

#include "_public.h"  int SNPRINTF(char *str, size_t size, const char *fmt, ...)
{memset(str,0,size+1);va_list arg;va_start( arg, fmt );vsnprintf( str,size, fmt, arg );va_end( arg );
}char *STRCPY(char* dest,const size_t destlen,const char* src)
{memset(dest,0,destlen+1); if (strlen(src)>destlen) strncpy(dest,src,destlen);else strcpy(dest,src);return dest;
}char *STRNCPY(char* dest,const size_t destlen,const char* src,size_t n)
{memset(dest,0,destlen+1); if (n>destlen) strncpy(dest,src,destlen);else strncpy(dest,src,n);return dest;
}char *STRCAT(char* dest,const size_t destlen,const char* src)
{memset(dest+strlen(dest),0,destlen-strlen(dest)+1); int left=destlen-strlen(dest);int len=0;if (strlen(src)>left) len=left;else len=strlen(src);strncat(dest,src,len);return dest;
}char *STRNCAT(char* dest,const size_t destlen,const char* src,size_t n)
{memset(dest+strlen(dest),0,destlen-strlen(dest)+1); int left=destlen-strlen(dest);int len=0;if (n>left) len=left;else len=n;strncat(dest,src,len);return dest;
}// 把整数的时间转换为字符串格式的时间,格式如:"2019-02-08 12:05:08",如果转换成功函数返回0,失败返回-1,函数的声明如下:
int timetostr(const time_t ti,char *strtime)
{struct tm *sttm; if ( (sttm=localtime(&ti))==0 ) return -1;sprintf(strtime,"%d-%02d-%02d %02d:%02d:%02d",\sttm->tm_year+1900,sttm->tm_mon+1,sttm->tm_mday,sttm->tm_hour,sttm->tm_min,sttm->tm_sec);return 0;
}// 把字符串格式的时间转换为整数的时间,函数的声明如下:
int strtotime(const char *strtime,time_t *ti)
{char strtmp[11];//"2019-02-08 12:05:08"struct tm sttm; memset(strtmp,0,sizeof(strtmp));strncpy(strtmp,strtime,4);sttm.tm_year=atoi(strtmp)-1900;memset(strtmp,0,sizeof(strtmp));strncpy(strtmp,strtime+5,2);sttm.tm_mon=atoi(strtmp)-1;memset(strtmp,0,sizeof(strtmp));strncpy(strtmp,strtime+8,2);sttm.tm_mday=atoi(strtmp);memset(strtmp,0,sizeof(strtmp));strncpy(strtmp,strtime+11,2);sttm.tm_hour=atoi(strtmp);memset(strtmp,0,sizeof(strtmp));strncpy(strtmp,strtime+14,2);sttm.tm_min=atoi(strtmp);memset(strtmp,0,sizeof(strtmp));strncpy(strtmp,strtime+17,2);sttm.tm_sec=atoi(strtmp);*ti=mktime(&sttm);return *ti;
}CFile::CFile()   // 类的构造函数
{m_fp=0;m_bEnBuffer=true;memset(m_filename,0,sizeof(m_filename));memset(m_filenametmp,0,sizeof(m_filenametmp));
}// 关闭文件指针
void CFile::Close()
{if (m_fp==0) return;fclose(m_fp);  // 关闭文件指针m_fp=0;memset(m_filename,0,sizeof(m_filename));// 如果存在临时文件,就删除它。if (strlen(m_filenametmp)!=0) remove(m_filenametmp);memset(m_filenametmp,0,sizeof(m_filenametmp));
}// 判断文件是否已打开
bool CFile::IsOpened()
{if (m_fp==0) return false;return true;
}// 关闭文件指针,并删除文件
bool CFile::CloseAndRemove()
{if (m_fp==0) return true;fclose(m_fp);  // 关闭文件指针m_fp=0;if (remove(m_filename) != 0) { memset(m_filename,0,sizeof(m_filename)); return false; }memset(m_filename,0,sizeof(m_filename));return true;
}CFile::~CFile()   // 类的析构函数
{Close();
}// 打开文件,参数与FOPEN相同,打开成功true,失败返回false
bool CFile::Open(const char *filename,const char *openmode,bool bEnBuffer)
{Close();if ( (m_fp=FOPEN(filename,openmode)) == 0 ) return false;memset(m_filename,0,sizeof(m_filename));strncpy(m_filename,filename,300);m_bEnBuffer=bEnBuffer;return true;
}// 专为改名而打开文件,参数与fopen相同,打开成功true,失败返回false
bool CFile::OpenForRename(const char *filename,const char *openmode,bool bEnBuffer)
{Close();memset(m_filename,0,sizeof(m_filename));strncpy(m_filename,filename,300);memset(m_filenametmp,0,sizeof(m_filenametmp));SNPRINTF(m_filenametmp,300,"%s.tmp",m_filename);if ( (m_fp=FOPEN(m_filenametmp,openmode)) == 0 ) return false;m_bEnBuffer=bEnBuffer;return true;
}// 关闭文件并改名
bool CFile::CloseAndRename()
{if (m_fp==0) return false;fclose(m_fp);  // 关闭文件指针m_fp=0;if (rename(m_filenametmp,m_filename) != 0){remove(m_filenametmp);memset(m_filename,0,sizeof(m_filename));memset(m_filenametmp,0,sizeof(m_filenametmp));return false;}memset(m_filename,0,sizeof(m_filename));memset(m_filenametmp,0,sizeof(m_filenametmp));return true;
}// 调用fprintf向文件写入数据
void CFile::Fprintf(const char *fmt, ... )
{if ( m_fp == 0 ) return;va_list arg;va_start( arg, fmt );vfprintf( m_fp, fmt, arg );va_end( arg );if ( m_bEnBuffer == false ) fflush(m_fp);
}// 调用fgets从文件中读取一行,bDelCRT=true删除换行符,false不删除,缺省为false
bool CFile::Fgets(char *strBuffer,const int ReadSize,bool bDelCRT)
{if ( m_fp == 0 ) return false;memset(strBuffer,0,ReadSize+1);if (fgets(strBuffer,ReadSize,m_fp) == 0) return false;if (bDelCRT==true){DeleteRChar(strBuffer,'\n'); DeleteRChar(strBuffer,'\r');}return true;
}// 从文件文件中读取一行
// strEndStr是一行数据的结束标志,如果为空,则以换行符"\n"为结束标志。
// 与Fgets不同,本函数不删除结束标志
bool CFile::FFGETS(char *strBuffer,const int ReadSize,const char *strEndStr)
{return FGETS(m_fp,strBuffer,ReadSize,strEndStr);
}// 调用fread从文件中读取数据。
size_t CFile::Fread(void *ptr, size_t size)
{if ( m_fp == 0 ) return -1;return fread(ptr,1,size,m_fp);
}// 调用fwrite向文件中写数据
size_t CFile::Fwrite(const void *ptr, size_t size )
{if ( m_fp == 0 ) return -1;size_t tt=fwrite(ptr,1,size,m_fp);if ( m_bEnBuffer == false ) fflush(m_fp);return tt;
}// 从文件文件中读取一行
// strEndStr是一行数据的结束标志,如果为空,则以换行符"\n"为结束标志。
// 本函数不会删除行的结束标志
bool FGETS(const FILE *fp,char *strBuffer,const int ReadSize,const char *strEndStr)
{char strLine[ReadSize+1];memset(strLine,0,sizeof(strLine));while (true){memset(strLine,0,ReadSize+1);if (fgets(strLine,ReadSize,(FILE *)fp) == 0) break;// 防止strBuffer溢出if ( (strlen(strBuffer)+strlen(strLine)) >= (unsigned int)ReadSize ) break;strcat(strBuffer,strLine);if (strEndStr == 0) return true;if (strstr(strLine,strEndStr)!= 0) return true;}return false;
}CCmdStr::CCmdStr()
{m_vCmdStr.clear();
}void CCmdStr::SplitToCmd(const string in_string,const char *in_sep,const bool bdeletespace)
{// 清除所有的旧数据m_vCmdStr.clear();int iPOS=0;string srcstr,substr;srcstr=in_string;char str[2048];while ( (iPOS=srcstr.find(in_sep)) >= 0){substr=srcstr.substr(0,iPOS);if (bdeletespace == true){memset(str,0,sizeof(str));strncpy(str,substr.c_str(),2000);DeleteLRChar(str,' ');substr=str;}m_vCmdStr.push_back(substr);iPOS=iPOS+strlen(in_sep);srcstr=srcstr.substr(iPOS,srcstr.size()-iPOS);}substr=srcstr;if (bdeletespace == true){memset(str,0,sizeof(str));strncpy(str,substr.c_str(),2000);DeleteLRChar(str,' ');substr=str;}m_vCmdStr.push_back(substr);return;
}int CCmdStr::CmdCount()
{return m_vCmdStr.size();
}bool CCmdStr::GetValue(const int inum,char *in_return)
{if (inum >= m_vCmdStr.size()) return false;strcpy(in_return,m_vCmdStr[inum].c_str());return true;
}bool CCmdStr::GetValue(const int inum,char *in_return,const int in_len)
{memset(in_return,0,in_len+1);if (inum >= m_vCmdStr.size()) return false;if (m_vCmdStr[inum].length() > (unsigned int)in_len){strncpy(in_return,m_vCmdStr[inum].c_str(),in_len);}else{strcpy(in_return,m_vCmdStr[inum].c_str());}return true;
}bool CCmdStr::GetValue(const int inum,int *in_return)
{(*in_return) = 0;if (inum >= m_vCmdStr.size()) return false;(*in_return) = atoi(m_vCmdStr[inum].c_str());return true;
}bool CCmdStr::GetValue(const int inum,long *in_return)
{(*in_return) = 0;if (inum >= m_vCmdStr.size()) return false;(*in_return) = atol(m_vCmdStr[inum].c_str());return true;
}bool CCmdStr::GetValue(const int inum,double *in_return)
{(*in_return) = 0;if (inum >= m_vCmdStr.size()) return false;(*in_return) = (double)atof(m_vCmdStr[inum].c_str());return true;
}CCmdStr::~CCmdStr()
{m_vCmdStr.clear();
}/* 删除字符串左边指定的字符 */
void DeleteLChar(char *in_string,const char in_char)
{if (in_string == 0) return;if (strlen(in_string) == 0) return;char strTemp[strlen(in_string)+1];int iTemp=0;memset(strTemp,0,sizeof(strTemp));strcpy(strTemp,in_string);while ( strTemp[iTemp] == in_char )  iTemp++;memset(in_string,0,strlen(in_string)+1);strcpy(in_string,strTemp+iTemp);return;
}/* 删除字符串右边指定的字符 */
void DeleteRChar(char *in_string,const char in_char)
{if (in_string == 0) return;int istrlen = strlen(in_string);while (istrlen>0){if (in_string[istrlen-1] != in_char) break;in_string[istrlen-1]=0;istrlen--;}
}/* 删除字符串两边指定的字符 */
void DeleteLRChar(char *in_string,const char in_char)
{DeleteLChar(in_string,in_char);DeleteRChar(in_string,in_char);
}/*取操作系统的时间out_stime是输出结果in_interval是偏移常量,单位是秒返回的格式由fmt决定,fmt目前的取值如下,如果需要,可以增加:yyyy-mm-dd hh24:mi:ss,此格式是缺省格式yyyymmddhh24missyyyy-mm-ddyyyymmddhh24:mi:sshh24misshh24:mihh24mihh24mi
*/
void LocalTime(char *out_stime,const char *in_fmt,const int in_interval)
{if (in_fmt == 0) memset(out_stime,0,19+1);else memset(out_stime,0,strlen(in_fmt)+1);  time_t  timer;struct tm nowtimer;time( &timer ); timer=timer+in_interval;nowtimer = *localtime ( &timer ); nowtimer.tm_mon++;if (in_fmt==0){snprintf(out_stime,20,"%04u-%02u-%02u %02u:%02u:%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);return;}if (strcmp(in_fmt,"yyyy-mm-dd hh24:mi:ss") == 0){snprintf(out_stime,20,"%04u-%02u-%02u %02u:%02u:%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);return;}if (strcmp(in_fmt,"yyyy-mm-dd hh24:mi") == 0){snprintf(out_stime,17,"%04u-%02u-%02u %02u:%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,nowtimer.tm_min);return;}if (strcmp(in_fmt,"yyyy-mm-dd hh24") == 0){snprintf(out_stime,14,"%04u-%02u-%02u %02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour);return;}if (strcmp(in_fmt,"yyyy-mm-dd") == 0){snprintf(out_stime,11,"%04u-%02u-%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday); return;}if (strcmp(in_fmt,"yyyy-mm") == 0){snprintf(out_stime,8,"%04u-%02u",nowtimer.tm_year+1900,nowtimer.tm_mon); return;}if (strcmp(in_fmt,"yyyymmddhh24miss") == 0){snprintf(out_stime,15,"%04u%02u%02u%02u%02u%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);return;}if (strcmp(in_fmt,"yyyymmddhh24mi") == 0){snprintf(out_stime,13,"%04u%02u%02u%02u%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,nowtimer.tm_min);return;}if (strcmp(in_fmt,"yyyymmddhh24") == 0){snprintf(out_stime,11,"%04u%02u%02u%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour);return;}if (strcmp(in_fmt,"yyyymmdd") == 0){snprintf(out_stime,9,"%04u%02u%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday); return;}if (strcmp(in_fmt,"hh24miss") == 0){snprintf(out_stime,7,"%02u%02u%02u",nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec); return;}if (strcmp(in_fmt,"hh24mi") == 0){snprintf(out_stime,5,"%02u%02u",nowtimer.tm_hour,nowtimer.tm_min); return;}if (strcmp(in_fmt,"hh24") == 0){snprintf(out_stime,3,"%02u",nowtimer.tm_hour); return;}if (strcmp(in_fmt,"mi") == 0){snprintf(out_stime,3,"%02u",nowtimer.tm_min); return;}
}CLogFile::CLogFile()
{m_tracefp = 0;memset(m_filename,0,sizeof(m_filename));memset(m_openmode,0,sizeof(m_openmode));m_bBackup=true;m_bEnBuffer=false;  //日志文件一般不启用缓冲区,可以立即看到
}CLogFile::~CLogFile()
{Close();
}void CLogFile::Close()
{if (m_tracefp != 0){fclose(m_tracefp); m_tracefp=0;}
}// filename日志文件名
// openmode打开文件的方式,操作日志文件的权限,同打开文件函数(FOPEN)使用方法一致
// bBackup,true-备份,false-不备份,在多进程的服务程序中,如果多个进行共用一个日志文件,bBackup必须为false
// bEnBuffer:true-启用缓冲区,false-不启用缓冲区,如果启用缓冲区,那么写进日志文件中的内容不会立即写入文件是
bool CLogFile::Open(const char *in_filename,const char *in_openmode,bool bBackup,bool bEnBuffer)
{if (m_tracefp != 0) { fclose(m_tracefp); m_tracefp=0; }m_bEnBuffer=bEnBuffer;memset(m_filename,0,sizeof(m_filename));strcpy(m_filename,in_filename);memset(m_openmode,0,sizeof(m_openmode));strcpy(m_openmode,in_openmode);if ((m_tracefp=FOPEN(m_filename,m_openmode)) == NULL) return false;m_bBackup=bBackup;return true;
}// 如果日志文件大于MAXLOGFSIZE,就备份它
bool CLogFile::BackupLogFile()
{// 不备份if (m_bBackup == false) return true;if (m_tracefp == 0) return true;fseek(m_tracefp,0L,2);  //定位到文件最后,我们打开日志文件用a或a+这种方式,一打开任何时候文件指针都是在文件最后,这行代码可省if (ftell(m_tracefp) > MAXLOGFSIZE*1024*1024)  // 看看文件有多大{fclose(m_tracefp); m_tracefp=0;char strLocalTime[21];memset(strLocalTime,0,sizeof(strLocalTime));LocalTime(strLocalTime,"yyyymmddhhmiss");char bak_filename[301];memset(bak_filename,0,sizeof(bak_filename));snprintf(bak_filename,300,"%s.%s",m_filename,strLocalTime);rename(m_filename,bak_filename);
printf("rename %s m_filename ok\n",bak_filename);if ((m_tracefp=FOPEN(m_filename,m_openmode)) == NULL) return false;}return true;
}bool CLogFile::Write(const char *fmt,...)
{if (BackupLogFile() == false) return false;char strtime[20]; LocalTime(strtime);va_list ap;va_start(ap,fmt);if (m_tracefp == 0)  // m_tracefp日志文件指针{fprintf(stdout,"%s ",strtime); // stdout:C语言缺省的标准输出,strtime:输出时间vfprintf(stdout,fmt,ap);  // ap:输出内容if (m_bEnBuffer==false) fflush(stdout);}else{fprintf(m_tracefp,"%s ",strtime);vfprintf(m_tracefp,fmt,ap);if (m_bEnBuffer==false) fflush(m_tracefp);}va_end(ap);return true;
}bool CLogFile::WriteEx(const char *fmt,...)
{va_list ap;va_start(ap,fmt);if (m_tracefp == 0){vfprintf(stdout,fmt,ap);if (m_bEnBuffer==false) fflush(stdout);}else{vfprintf(m_tracefp,fmt,ap);if (m_bEnBuffer==false) fflush(m_tracefp);}va_end(ap);return true;
}// 关闭全部的信号和输入输出
void CloseIOAndSignal()
{int ii=0;for (ii=0;ii<50;ii++){signal(ii,SIG_IGN); close(ii);}
}// 用某文件或目录的全路径中的目录创建目录,以级该目录下的各级子目录
bool MKDIR(const char *filename,bool bisfilename)
{// 检查目录是否存在,如果不存在,逐级创建子目录char strPathName[301];for (int ii=1; ii<strlen(filename);ii++){if (filename[ii] != '/') continue;memset(strPathName,0,sizeof(strPathName));strncpy(strPathName,filename,ii);if (access(strPathName,F_OK) == 0) continue;if (mkdir(strPathName,00755) != 0) return false;}if (bisfilename==false){if (access(filename,F_OK) != 0){if (mkdir(filename,00755) != 0) return false;}}return true;
}// 调用fopen函数打开文件,如果文件名中包含的目录不存在,就创建目录
FILE *FOPEN(const char *filename,const char *mode)
{if (MKDIR(filename) == false) return NULL;return fopen(filename,mode);
}// 获取文件的大小,返回字节数
int FileSize(const char *in_FullFileName)
{struct stat st_filestat;if (stat(in_FullFileName,&st_filestat) < 0) return -1;return st_filestat.st_size;
}// 更改文件的修改时间属性
int UTime(const char *filename,const char *mtime)
{struct utimbuf stutimbuf;stutimbuf.actime=stutimbuf.modtime=UTCTime(mtime);return utime(filename,&stutimbuf);
}// 把字符串格式的时间转换为time_t
// stime为输入的时间,格式不限,但一定要包括yyyymmddhh24miss
time_t UTCTime(const char *stime)
{char strtime[21],yyyy[5],mm[3],dd[3],hh[3],mi[3],ss[3];memset(strtime,0,sizeof(strtime));memset(yyyy,0,sizeof(yyyy));memset(mm,0,sizeof(mm));memset(dd,0,sizeof(dd));memset(hh,0,sizeof(hh));memset(mi,0,sizeof(mi));memset(ss,0,sizeof(ss));PickNumber(stime,strtime,false,false);if (strlen(strtime) != 14) return -1;strncpy(yyyy,strtime,4);strncpy(mm,strtime+4,2);strncpy(dd,strtime+6,2);strncpy(hh,strtime+8,2);strncpy(mi,strtime+10,2);strncpy(ss,strtime+12,2);struct tm time_str;time_str.tm_year = atoi(yyyy) - 1900;time_str.tm_mon = atoi(mm) - 1;time_str.tm_mday = atoi(dd);time_str.tm_hour = atoi(hh);time_str.tm_min = atoi(mi);time_str.tm_sec = atoi(ss);time_str.tm_isdst = 0;return mktime(&time_str);
}// 从一个字符串中提取数字,bWithSign==true表示包括负号,bWithDOT==true表示包括圆点
void PickNumber(const char *strSrc,char *strDst,const bool bWithSign,const bool bWithDOT)
{char strtemp[1024];memset(strtemp,0,sizeof(strtemp));strncpy(strtemp,strSrc,1000);DeleteLRChar(strtemp,' ');// 为了防止strSrc和strDst为同一变量的情况,所以strDst不能初始化// 判断字符串中的负号是否合法if ( (bWithSign==true) && (JudgeSignDOT(strtemp,"-") == false) ){strcpy(strDst,""); return;}// 判断字符串中的正号是否合法if ( (bWithSign==true) && (JudgeSignDOT(strtemp,"+") == false) ){strcpy(strDst,""); return;}// 判断字符串中的圆点是否合法if ( (bWithDOT==true) && (JudgeSignDOT(strtemp,".") == false) ){strcpy(strDst,""); return;}int iPosSrc,iPosDst,iLen;iPosSrc=iPosDst=iLen=0;iLen=strlen(strtemp);for (iPosSrc=0;iPosSrc<iLen;iPosSrc++){if ( (bWithSign==true) && (strtemp[iPosSrc] == '+') ){strDst[iPosDst++]=strtemp[iPosSrc]; continue;}if ( (bWithSign==true) && (strtemp[iPosSrc] == '-') ){strDst[iPosDst++]=strtemp[iPosSrc]; continue;}if ( (bWithDOT==true) && (strtemp[iPosSrc] == '.') ){strDst[iPosDst++]=strtemp[iPosSrc]; continue;}if (isdigit(strtemp[iPosSrc])) strDst[iPosDst++]=strtemp[iPosSrc];}strDst[iPosDst]=0;return;
}// 判断字符串中的负号和圆点是否合法
bool JudgeSignDOT(const char *strSrc,const char *strBZ)
{char *pos=0;pos=(char *)strstr(strSrc,strBZ);// 如果没有包括待搜索的字符串,就返回trueif (pos == 0) return true;// 如果strlen(pos)==1,表示结果中只有符号,没有其它字符,返回falseif (strlen(pos)==1) return false;// 如果待搜索的字符串是+号,就一定要是第一个字符if ( (strcmp(strBZ,"+") == 0) && (strncmp(strSrc,"+",1) != 0) ) return false;// 如果待搜索的字符串是-号,就一定要是第一个字符if ( (strcmp(strBZ,"-") == 0) && (strncmp(strSrc,"-",1) != 0) ) return false;// 如果包括多个待搜索的字符串,就返回falseif (strstr(pos+1,strBZ) > 0) return false;return true;
}/*把一个字符串表格的时间加上一个偏移量,得到偏移后的时间in_stime是传入的时间,任意格式,但是一定要包括yyyymmddhh24miss,是否有分隔符没有关系。把yyyy-mm-dd hh24:mi:ss偏移in_interval秒传出的格式由fmt决定,fmt目前的取值如下,如果需要,可以增加:yyyy-mm-dd hh24:mi:ss(此格式是缺省格式)yyyymmddhh24missyyyymmddhh24missyyyy-mm-ddyyyymmddhh24:mi:sshh24misshh24:mihh24mi返回值:0-成功,-1-失败。
*/
int AddTime(const char *in_stime,char *out_stime,const int in_interval,const char *in_fmt)
{time_t  timer;struct tm nowtimer;timer=UTCTime(in_stime)+in_interval;nowtimer = *localtime ( &timer ); nowtimer.tm_mon++;// 为了防止in_stime和out_stime为同一变量的情况,所以out_stime在此处初始化,代码不可提前out_stime[0]=0;if (in_fmt==0){snprintf(out_stime,20,"%04u-%02u-%02u %02u:%02u:%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec); return 0;}if (strcmp(in_fmt,"yyyy-mm-dd hh24:mi:ss") == 0){snprintf(out_stime,20,"%04u-%02u-%02u %02u:%02u:%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec); return 0;}if (strcmp(in_fmt,"yyyymmddhh24miss") == 0){snprintf(out_stime,15,"%04u%02u%02u%02u%02u%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec); return 0;}if (strcmp(in_fmt,"yyyy-mm-dd") == 0){snprintf(out_stime,11,"%04u-%02u-%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday); return 0;}if (strcmp(in_fmt,"yyyymmdd") == 0){snprintf(out_stime,9,"%04u%02u%02u",nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday); return 0;}if (strcmp(in_fmt,"hh24:mi:ss") == 0){snprintf(out_stime,9,"%02u:%02u:%02u",nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec); return 0;}if (strcmp(in_fmt,"hh24:mi") == 0){snprintf(out_stime,9,"%02u:%02u",nowtimer.tm_hour,nowtimer.tm_min); return 0;}if (strcmp(in_fmt,"hh24mi") == 0){snprintf(out_stime,7,"%02u%02u",nowtimer.tm_hour,nowtimer.tm_min); return 0;}return -1;
}// 获取文件的时间,即modtime
void FileMTime(const char *in_FullFileName,char *out_ModTime)
{struct tm nowtimer;struct stat st_filestat;stat(in_FullFileName,&st_filestat);nowtimer = *localtime(&st_filestat.st_mtime);nowtimer.tm_mon++;snprintf(out_ModTime,15,"%04u%02u%02u%02u%02u%02u",\nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);
}// 操作XMLBuffer的函数
// in_XMLBuffer,XML格式的字符串
// in_FieldName,字段的标签名
// out_Value,获取内容存放的变量的指针
bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,char *out_Value,const int in_Len)
{strcpy(out_Value,"");char *start=NULL,*end=NULL;char m_SFieldName[51],m_EFieldName[51];int m_NameLen = strlen(in_FieldName);memset(m_SFieldName,0,sizeof(m_SFieldName));memset(m_EFieldName,0,sizeof(m_EFieldName));snprintf(m_SFieldName,50,"<%s>",in_FieldName);snprintf(m_EFieldName,50,"</%s>",in_FieldName);start=0; end=0;start = (char *)strstr(in_XMLBuffer,m_SFieldName);if (start != 0){end   = (char *)strstr(start,m_EFieldName);}if ((start==0) || (end == 0)){return false;}int   m_ValueLen = end - start - m_NameLen - 2 + 1 ;if ( ((m_ValueLen-1) <= in_Len) || (in_Len == 0) ){strncpy(out_Value,start+m_NameLen+2,m_ValueLen-1); out_Value[m_ValueLen-1]=0;}else{strncpy(out_Value,start+m_NameLen+2,in_Len); out_Value[in_Len]=0;}DeleteLRChar(out_Value,' ');return true;
}bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,bool *out_Value)
{(*out_Value) = false;char strTemp[51];memset(strTemp,0,sizeof(strTemp));if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,10) == true){if ( (strcmp(strTemp,"true")==0) || (strcmp(strTemp,"true")==0) ) (*out_Value)=true; return true;}return false;
}bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,int *out_Value)
{(*out_Value) = 0;char strTemp[51];memset(strTemp,0,sizeof(strTemp));if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,50) == true){(*out_Value) = atoi(strTemp); return true;}return false;
}bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,unsigned int *out_Value)
{(*out_Value) = 0;char strTemp[51];memset(strTemp,0,sizeof(strTemp));if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,50) == true){(*out_Value) = (unsigned int)atoi(strTemp); return true;}return false;
}bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,long *out_Value)
{(*out_Value) = 0;char strTemp[51];memset(strTemp,0,sizeof(strTemp));if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,50) == true){(*out_Value) = atol(strTemp); return true;}return false;
}bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,unsigned long *out_Value)
{(*out_Value) = 0;char strTemp[51];memset(strTemp,0,sizeof(strTemp));if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,50) == true){(*out_Value) = (unsigned long)atol(strTemp); return true;}return false;
}bool GetXMLBuffer(const char *in_XMLBuffer,const char *in_FieldName,double *out_Value)
{(*out_Value) = 0;char strTemp[51];memset(strTemp,0,sizeof(strTemp));if (GetXMLBuffer(in_XMLBuffer,in_FieldName,strTemp,50) == true){(*out_Value) = atof(strTemp); return true;}return false;
}// 判断文件名是否和MatchFileName匹配,如果不匹配,返回失败
bool MatchFileName(const string in_FileName,const string in_MatchStr)
{// 如果用于比较的字符是空的,返回falseif (in_MatchStr.size() == 0) return false;// 如果被比较的字符串是“*”,返回trueif (in_MatchStr == "*") return true;// 处理文件名匹配规则中的时间匹配dd-nn.mmchar strTemp[2049];memset(strTemp,0,sizeof(strTemp));strncpy(strTemp,in_MatchStr.c_str(),2000);int ii,jj;int  iPOS1,iPOS2;CCmdStr CmdStr,CmdSubStr;string strFileName,strMatchStr;strFileName=in_FileName;strMatchStr=strTemp;// 把字符串都转换成大写后再来比较ToUpper(strFileName);ToUpper(strMatchStr);CmdStr.SplitToCmd(strMatchStr,",");for (ii=0;ii<CmdStr.CmdCount();ii++){// 如果为空,就一定要跳过,否则就会被配上if (CmdStr.m_vCmdStr[ii].empty() == true) continue;iPOS1=iPOS2=0;CmdSubStr.SplitToCmd(CmdStr.m_vCmdStr[ii],"*");for (jj=0;jj<CmdSubStr.CmdCount();jj++){// 如果是文件名的首部if (jj == 0){if (strncmp(strFileName.c_str(),CmdSubStr.m_vCmdStr[jj].c_str(),CmdSubStr.m_vCmdStr[jj].size()) != 0) break;}// 如果是文件名的尾部if (jj == CmdSubStr.CmdCount()-1){if (strcmp(strFileName.c_str()+strFileName.size()-CmdSubStr.m_vCmdStr[jj].size(),CmdSubStr.m_vCmdStr[jj].c_str()) != 0) break;}iPOS2=strFileName.find(CmdSubStr.m_vCmdStr[jj],iPOS1);if (iPOS2 < 0) break;iPOS1=iPOS2+CmdSubStr.m_vCmdStr[jj].size();}if (jj==CmdSubStr.CmdCount()) return true;}return false;
}void ToUpper(char *str)
{if (str == 0) return;if (strlen(str) == 0) return;int istrlen=strlen(str);for (int ii=0;ii<istrlen;ii++){if ( (str[ii] >= 97) && (str[ii] <= 122) ) str[ii]=str[ii] - 32;}
}void ToUpper(string &str)
{if (str.empty()) return;char strtemp[str.size()+1];memset(strtemp,0,sizeof(strtemp));strcpy(strtemp,str.c_str());ToUpper(strtemp);str=strtemp;return;
}void ToLower(char *str)
{if (str == 0) return;if (strlen(str) == 0) return;int istrlen=strlen(str);for (int ii=0;ii<istrlen;ii++){if ( (str[ii] >= 65) && (str[ii] <= 90) ) str[ii]=str[ii] + 32;}
}void ToLower(string &str)
{if (str.empty()) return;char strtemp[str.size()+1];memset(strtemp,0,sizeof(strtemp));strcpy(strtemp,str.c_str());ToLower(strtemp);str=strtemp;return;
}CDir::CDir()
{m_uPOS=0;memset(m_DateFMT,0,sizeof(m_DateFMT));strcpy(m_DateFMT,"yyyy-mm-dd hh24:mi:ss");m_vFileName.clear();initdata();
}void CDir::initdata()
{memset(m_DirName,0,sizeof(m_DirName));memset(m_FileName,0,sizeof(m_FileName));memset(m_FullFileName,0,sizeof(m_FullFileName));m_FileSize=0;memset(m_CreateTime,0,sizeof(m_CreateTime));memset(m_ModifyTime,0,sizeof(m_ModifyTime));memset(m_AccessTime,0,sizeof(m_AccessTime));
}// 设置日期时间的格式,支持"yyyy-mm-dd hh24:mi:ss"和"yyyymmddhh24miss"两种格式,缺省是前者
void CDir::SetDateFMT(const char *in_DateFMT)
{memset(m_DateFMT,0,sizeof(m_DateFMT));strcpy(m_DateFMT,in_DateFMT);
}// 打开目录,获取文件名信息,存放于m_vFileName容器中
// in_dirname,待打开的目录名
// in_MatchStr,待获取文件名的匹配规则
// in_MaxCount,获取文件的最大数量
// bAndChild,是否打开各级子目录
// bSort,是否对结果时行排序
bool CDir::OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild,bool bSort)
{m_uPOS=0;m_vFileName.clear();// 如果目录不存在,就创建该目录if (MKDIR(in_DirName,false) == false) return false;bool bRet=_OpenDir(in_DirName,in_MatchStr,in_MaxCount,bAndChild);if (bSort==true){sort(m_vFileName.begin(), m_vFileName.end());}return bRet;
}// 打开目录,这是个递归函数
bool CDir::_OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild)
{DIR *dir;if ( (dir=opendir(in_DirName)) == NULL ) return false;char strTempFileName[1024];struct dirent *st_fileinfo;struct stat st_filestat;while ((st_fileinfo=readdir(dir)) != NULL){// 以"."打头的文件不处理if (st_fileinfo->d_name[0]=='.') continue;memset(strTempFileName,0,sizeof(strTempFileName));snprintf(strTempFileName,300,"%s//%s",in_DirName,st_fileinfo->d_name);UpdateStr(strTempFileName,"//","/");stat(strTempFileName,&st_filestat);// 判断是否是目录if (S_ISDIR(st_filestat.st_mode)){if (bAndChild == true){if (_OpenDir(strTempFileName,in_MatchStr,in_MaxCount,bAndChild) == false) {closedir(dir); return false;}}}else{if (MatchFileName(st_fileinfo->d_name,in_MatchStr) == false) continue;m_vFileName.push_back(strTempFileName);if ( m_vFileName.size()>in_MaxCount ) break;}}closedir(dir);return true;
}bool CDir::ReadDir()
{initdata();// 如果已读完,清空容器if (m_uPOS >= m_vFileName.size()) {m_uPOS=0; m_vFileName.clear(); return false;}int pos=0;pos=m_vFileName[m_uPOS].find_last_of("/");// 目录名memset(m_DirName,0,sizeof(m_DirName));strcpy(m_DirName,m_vFileName[m_uPOS].substr(0,pos).c_str());// 文件名memset(m_FileName,0,sizeof(m_FileName));strcpy(m_FileName,m_vFileName[m_uPOS].substr(pos+1,m_vFileName[m_uPOS].size()-pos-1).c_str());// 文件全名,包括路径snprintf(m_FullFileName,300,"%s",m_vFileName[m_uPOS].c_str());struct stat st_filestat;stat(m_FullFileName,&st_filestat);m_FileSize=st_filestat.st_size;struct tm nowtimer;if (strcmp(m_DateFMT,"yyyy-mm-dd hh24:mi:ss") == 0){nowtimer = *localtime(&st_filestat.st_mtime); nowtimer.tm_mon++;snprintf(m_ModifyTime,20,"%04u-%02u-%02u %02u:%02u:%02u",\nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);nowtimer = *localtime(&st_filestat.st_ctime); nowtimer.tm_mon++;snprintf(m_CreateTime,20,"%04u-%02u-%02u %02u:%02u:%02u",\nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);nowtimer = *localtime(&st_filestat.st_atime); nowtimer.tm_mon++;snprintf(m_AccessTime,20,"%04u-%02u-%02u %02u:%02u:%02u",\nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);}if (strcmp(m_DateFMT,"yyyymmddhh24miss") == 0){nowtimer = *localtime(&st_filestat.st_mtime); nowtimer.tm_mon++;snprintf(m_ModifyTime,20,"%04u%02u%02u%02u%02u%02u",\nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);nowtimer = *localtime(&st_filestat.st_ctime); nowtimer.tm_mon++;snprintf(m_CreateTime,20,"%04u%02u%02u%02u%02u%02u",\nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);nowtimer = *localtime(&st_filestat.st_atime); nowtimer.tm_mon++;snprintf(m_AccessTime,20,"%04u%02u%02u%02u%02u%02u",\nowtimer.tm_year+1900,nowtimer.tm_mon,nowtimer.tm_mday,\nowtimer.tm_hour,nowtimer.tm_min,nowtimer.tm_sec);}m_uPOS++;return true;
}CDir::~CDir()
{m_vFileName.clear();// m_vDirName.clear();
}// 把字符串中的某字符串用另一个字符串代替
void UpdateStr(char *in_string,const char *in_str1,const char *in_str2,bool bLoop)
{if (in_string == 0) return;if (strlen(in_string) == 0) return;char strTemp[2048];char *strStart=in_string;char *strPos=0;while (true){if (strlen(in_string) >2000) break;if (bLoop == true){strPos=strstr(in_string,in_str1);}else{strPos=strstr(strStart,in_str1);}if (strPos == 0) break;memset(strTemp,0,sizeof(strTemp));strncpy(strTemp,in_string,strPos-in_string);strcat(strTemp,in_str2);strcat(strTemp,strPos+strlen(in_str1));strcpy(in_string,strTemp);strStart=strPos+strlen(in_str2);}
}// 删除文件,如果删除失败,会尝试in_times次
bool REMOVE(const char *in_filename,const int in_times)
{// 如果文件不存在,直接返回失败if (access(in_filename,R_OK) != 0) return false;for (int ii=0;ii<in_times;ii++){if (remove(in_filename) == 0) return true;usleep(100000);}return false;
}// 把in_srcfilename改名为in_dstfilename,如果改名失败,会尝试in_times次
bool RENAME(const char *in_srcfilename,const char *in_dstfilename,const int in_times)
{// 如果文件不存在,直接返回失败if (access(in_srcfilename,R_OK) != 0) return false;if (MKDIR(in_dstfilename) == false) return false;for (int ii=0;ii<in_times;ii++){if (rename(in_srcfilename,in_dstfilename) == 0) return true;usleep(100000);}return false;
}CTcpClient::CTcpClient()
{m_sockfd=-1;memset(m_ip,0,sizeof(m_ip));m_port=0;m_btimeout=false;
}bool CTcpClient::ConnectToServer(const char *ip,const int port)
{if (m_sockfd != -1) { close(m_sockfd); m_sockfd = -1; }strcpy(m_ip,ip);m_port=port;struct hostent* h;struct sockaddr_in servaddr;if ( (m_sockfd = socket(AF_INET,SOCK_STREAM,0) ) < 0) return false;if ( !(h = gethostbyname(m_ip)) ){close(m_sockfd);  m_sockfd = -1; return false;}memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(m_port);  // 指定服务端的通讯端口memcpy(&servaddr.sin_addr,h->h_addr,h->h_length);if (connect(m_sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)) != 0){close(m_sockfd);  m_sockfd = -1; return false;}return true;
}bool CTcpClient::Read(char *buffer,const int itimeout)
{if (m_sockfd == -1) return false;if (itimeout>0){fd_set tmpfd;FD_ZERO(&tmpfd);FD_SET(m_sockfd,&tmpfd);struct timeval timeout;timeout.tv_sec = itimeout; timeout.tv_usec = 0;m_btimeout = false;int i;if ( (i = select(m_sockfd+1,&tmpfd,0,0,&timeout)) <= 0 ){if (i==0) m_btimeout = true;return false;}}m_buflen = 0;return (TcpRead(m_sockfd,buffer,&m_buflen));
}bool CTcpClient::Write(const char *buffer,const int ibuflen)
{if (m_sockfd == -1) return false;fd_set tmpfd;FD_ZERO(&tmpfd);FD_SET(m_sockfd,&tmpfd);struct timeval timeout;timeout.tv_sec = 5; timeout.tv_usec = 0;m_btimeout = false;int i;if ( (i=select(m_sockfd+1,0,&tmpfd,0,&timeout)) <= 0 ){if (i==0) m_btimeout = true;return false;}int ilen=ibuflen;if (ibuflen==0) ilen=strlen(buffer);return(TcpWrite(m_sockfd,buffer,ilen));
}void CTcpClient::Close()
{if (m_sockfd > 0) close(m_sockfd); m_sockfd=-1;memset(m_ip,0,sizeof(m_ip));m_port=0;m_btimeout=false;
}CTcpClient::~CTcpClient()
{Close();
}CTcpServer::CTcpServer()
{m_listenfd=-1;m_connfd=-1;m_socklen=0;m_btimeout=false;
}bool CTcpServer::InitServer(const unsigned int port)
{if (m_listenfd > 0) { close(m_listenfd); m_listenfd=-1; }m_listenfd = socket(AF_INET,SOCK_STREAM,0);// WINDOWS平台如下//char b_opt='1';//setsockopt(m_listenfd,SOL_SOCKET,SO_REUSEADDR,&b_opt,sizeof(b_opt));//setsockopt(m_listenfd,SOL_SOCKET,SO_KEEPALIVE,&b_opt,sizeof(b_opt));// Linux如下int opt = 1; unsigned int len = sizeof(opt);setsockopt(m_listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,len);setsockopt(m_listenfd,SOL_SOCKET,SO_KEEPALIVE,&opt,len);memset(&m_servaddr,0,sizeof(m_servaddr));m_servaddr.sin_family = AF_INET;m_servaddr.sin_addr.s_addr = htonl(INADDR_ANY);m_servaddr.sin_port = htons(port);if (bind(m_listenfd,(struct sockaddr *)&m_servaddr,sizeof(m_servaddr)) != 0 ){CloseListen(); return false;}if (listen(m_listenfd,5) != 0 ){CloseListen(); return false;}m_socklen = sizeof(struct sockaddr_in);return true;
}bool CTcpServer::Accept()
{if (m_listenfd == -1) return false;if ((m_connfd=accept(m_listenfd,(struct sockaddr *)&m_clientaddr,(socklen_t*)&m_socklen)) < 0)return false;return true;
}char *CTcpServer::GetIP()
{return(inet_ntoa(m_clientaddr.sin_addr));
}bool CTcpServer::Read(char *buffer,const int itimeout)
{if (m_connfd == -1) return false;if (itimeout>0){fd_set tmpfd;FD_ZERO(&tmpfd);FD_SET(m_connfd,&tmpfd);struct timeval timeout;timeout.tv_sec = itimeout; timeout.tv_usec = 0;m_btimeout = false;int i;if ( (i = select(m_connfd+1,&tmpfd,0,0,&timeout)) <= 0 ){if (i==0) m_btimeout = true;return false;}}m_buflen = 0;return(TcpRead(m_connfd,buffer,&m_buflen));
}bool CTcpServer::Write(const char *buffer,const int ibuflen)
{if (m_connfd == -1) return false;fd_set tmpfd;FD_ZERO(&tmpfd);FD_SET(m_connfd,&tmpfd);struct timeval timeout;timeout.tv_sec = 5; timeout.tv_usec = 0;m_btimeout = false;int i;if ( (i=select(m_connfd+1,0,&tmpfd,0,&timeout)) <= 0 ){if (i==0) m_btimeout = true;return false;}int ilen = ibuflen;if (ilen==0) strlen(buffer);return(TcpWrite(m_connfd,buffer,ilen));
}void CTcpServer::CloseListen()
{if (m_listenfd > 0){close(m_listenfd); m_listenfd=-1;}
}void CTcpServer::CloseClient()
{if (m_connfd > 0){close(m_connfd); m_connfd=-1; }
}CTcpServer::~CTcpServer()
{CloseListen(); CloseClient();
}bool TcpRead(const int sockfd,char *buffer,int *ibuflen,const int itimeout)
{if (sockfd == -1) return false;if (itimeout > 0){fd_set tmpfd;FD_ZERO(&tmpfd);FD_SET(sockfd,&tmpfd);struct timeval timeout;timeout.tv_sec = itimeout; timeout.tv_usec = 0;int i;if ( (i = select(sockfd+1,&tmpfd,0,0,&timeout)) <= 0 ) return false;}(*ibuflen) = 0;if (Readn(sockfd,(char*)ibuflen,4) == false) return false;if (Readn(sockfd,buffer,(*ibuflen)) == false) return false;return true;
}bool TcpWrite(const int sockfd,const char *buffer,const int ibuflen)
{if (sockfd == -1) return false;fd_set tmpfd;FD_ZERO(&tmpfd);FD_SET(sockfd,&tmpfd);struct timeval timeout;timeout.tv_sec = 5; timeout.tv_usec = 0;if ( select(sockfd+1,0,&tmpfd,0,&timeout) <= 0 ) return false;int ilen=0;// 如果长度为0,就采用字符串的长度if (ibuflen==0) ilen=strlen(buffer);else ilen=ibuflen;char strTBuffer[ilen+4];memset(strTBuffer,0,sizeof(strTBuffer));memcpy(strTBuffer,&ilen,4);memcpy(strTBuffer+4,buffer,ilen);if (Writen(sockfd,strTBuffer,ilen+4) == false) return false;return true;
}bool Readn(const int sockfd,char *buffer,const size_t n)
{int nLeft,nread,idx;nLeft = n;idx = 0;while(nLeft > 0){if ( (nread = recv(sockfd,buffer + idx,nLeft,0)) <= 0) return false;idx += nread;nLeft -= nread;}return true;
}bool Writen(const int sockfd,const char *buffer,const size_t n)
{int nLeft,idx,nwritten;nLeft = n;  idx = 0;while(nLeft > 0 ){    if ( (nwritten = send(sockfd, buffer + idx,nLeft,0)) <= 0) return false;      nLeft -= nwritten;idx += nwritten;}return true;
}// 把文件通过sockfd发送给对端
bool SendFile(int sockfd,struct st_fileinfo *stfileinfo,CLogFile *logfile)
{char strSendBuffer[301],strRecvBuffer[301];memset(strSendBuffer,0,sizeof(strSendBuffer));snprintf(strSendBuffer,300,"<filename>%s</filename><filesize>%d</filesize><mtime>%s</mtime>",stfileinfo->filename,stfileinfo->filesize,stfileinfo->mtime);if (TcpWrite(sockfd,strSendBuffer) == false){if (logfile!=0) logfile->Write("SendFile TcpWrite() failed.\n"); return false;}int  bytes=0;int  total_bytes=0;int  onread=0;char buffer[1000];FILE *fp=0;if ( (fp=FOPEN(stfileinfo->filename,"rb")) == 0 ){if (logfile!=0) logfile->Write("SendFile FOPEN(%s) failed.\n",stfileinfo->filename); return false;}while (true){memset(buffer,0,sizeof(buffer));if ((stfileinfo->filesize-total_bytes) > 1000) onread=1000;else onread=stfileinfo->filesize-total_bytes;bytes=fread(buffer,1,onread,fp);if (bytes > 0){if (Writen(sockfd,buffer,bytes) == false){if (logfile!=0) logfile->Write("SendFile Writen() failed.\n"); fclose(fp); fp=0; return false;}}total_bytes = total_bytes + bytes;if ((int)total_bytes == stfileinfo->filesize) break;}fclose(fp);// 接收对端返回的确认报文int buflen=0;memset(strRecvBuffer,0,sizeof(strRecvBuffer));if (TcpRead(sockfd,strRecvBuffer,&buflen)==false){if (logfile!=0) logfile->Write("SendFile TcpRead() failed.\n"); return false;}if (strcmp(strRecvBuffer,"ok")!=0) return false;return true;
}// 接收通过socdfd发送过来的文件
bool RecvFile(int sockfd,struct st_fileinfo *stfileinfo,CLogFile *logfile)
{char strSendBuffer[301],strRecvBuffer[301];char strfilenametmp[301]; memset(strfilenametmp,0,sizeof(strfilenametmp));sprintf(strfilenametmp,"%s.tmp",stfileinfo->filename);FILE *fp=0;if ( (fp=FOPEN(strfilenametmp,"wb")) ==0)     // FOPEN可创建目录{if (logfile!=0) logfile->Write("RecvFile FOPEN %s failed.\n",strfilenametmp); return false;}int  total_bytes=0;int  onread=0;char buffer[1000];while (true){memset(buffer,0,sizeof(buffer));if ((stfileinfo->filesize-total_bytes) > 1000) onread=1000;else onread=stfileinfo->filesize-total_bytes;if (Readn(sockfd,buffer,onread) == false){if (logfile!=0) logfile->Write("RecvFile Readn() failed.\n"); fclose(fp); fp=0; return false;}fwrite(buffer,1,onread,fp);total_bytes = total_bytes + onread;if ((int)total_bytes == stfileinfo->filesize) break;}fclose(fp);// 重置文件的时间UTime(strfilenametmp,stfileinfo->mtime);memset(strSendBuffer,0,sizeof(strSendBuffer));if (RENAME(strfilenametmp,stfileinfo->filename)==true) strcpy(strSendBuffer,"ok");else strcpy(strSendBuffer,"failed");// 向对端返回响应内容if (TcpWrite(sockfd,strSendBuffer)==false){if (logfile!=0) logfile->Write("RecvFile TcpWrite() failed.\n"); return false;}if (strcmp(strSendBuffer,"ok") != 0) return false;return true;
}// 把某一个文件复制到另一个文件
bool COPY(const char *srcfilename,const char *dstfilename)
{if (MKDIR(dstfilename) == false) return false;char strdstfilenametmp[301];memset(strdstfilenametmp,0,sizeof(strdstfilenametmp));snprintf(strdstfilenametmp,300,"%s.tmp",dstfilename);int  srcfd,dstfd;srcfd=dstfd=-1;int iFileSize=FileSize(srcfilename);int  bytes=0;int  total_bytes=0;int  onread=0;char buffer[5000];if ( (srcfd=open(srcfilename,O_RDONLY)) < 0 ) return false;if ( (dstfd=open(strdstfilenametmp,O_WRONLY|O_CREAT|O_TRUNC,S_IWUSR|S_IRUSR|S_IXUSR)) < 0) { close(srcfd); return false; }while (true){memset(buffer,0,sizeof(buffer));if ((iFileSize-total_bytes) > 5000) onread=5000;else onread=iFileSize-total_bytes;bytes=read(srcfd,buffer,onread);if (bytes > 0) write(dstfd,buffer,bytes);total_bytes = total_bytes + bytes;if (total_bytes == iFileSize) break;}close(srcfd);close(dstfd);// 更改文件的修改时间属性char strmtime[21];memset(strmtime,0,sizeof(strmtime));FileMTime(srcfilename,strmtime);UTime(strdstfilenametmp,strmtime);if (RENAME(strdstfilenametmp,dstfilename) == false) { REMOVE(strdstfilenametmp); return false; }return true;
}CTimer::CTimer()
{memset(&m_start,0,sizeof(struct timeval));memset(&m_end,0,sizeof(struct timeval));// 开始计时Start();
}// 开始计时
void CTimer::Start()
{gettimeofday( &m_start, NULL );
}// 计算已逝去的时间,单位:秒,小数点后面是微秒
double CTimer::Elapsed()
{gettimeofday( &m_end, NULL );double dstart,dend;dstart=dend=0;char strtemp[51];memset(strtemp,0,sizeof(strtemp));snprintf(strtemp,30,"%ld.%ld",m_start.tv_sec,m_start.tv_usec);dstart=atof(strtemp);memset(strtemp,0,sizeof(strtemp));snprintf(strtemp,30,"%ld.%ld",m_end.tv_sec,m_end.tv_usec);dend=atof(strtemp);// 重新开始计时Start();return dend-dstart;
}

3._cmpublic.h

#ifndef _cmpublic_H
#define _cmpublic_H#include <stdio.h>
#include <utime.h>
//#include <curl/curl.h>
#include <string.h>
#include <strings.h>
#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <limits.h>
#include <time.h>
#include <math.h>
#include <stdarg.h>
#include <errno.h>
#include <signal.h>
#include <netdb.h>
#include <locale.h>
#include <dirent.h>
#include <termios.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iconv.h>
//#include<openssl/md5.h>#include <iostream>
#include <string>
#include <cstdlib>
#include <cstring>
#include <list>
#include <vector>
#include <deque>
#include <algorithm>//#include <boost/thread/thread.hpp>
//#include <boost/shared_ptr.hpp>
//#include <boost/signal.hpp>// 定义C++标准模板库的命名空间
using namespace std;// 以下是定义布尔数据类型的几个宏,在有的UNIX中,不一定支持布尔类型,
// 所以在这里自定义
#ifndef BOOL#define BOOL unsigned char
#endif#ifndef bool#define bool unsigned char
#endif#ifndef TRUE#define TRUE 1
#endif#ifndef true#define true 1
#endif#ifndef FALSE#define FALSE 0
#endif#ifndef false#define false 0
#endif#ifndef INT#define INT long
#endif#ifndef UINT#define UINT unsigned long
#endif#ifndef UCHAR#define UCHAR unsigned long
#endif#endif

【C/C++16】_public.h,_public.cpp,_cmpublic.h相关推荐

  1. 【C/C++17】_ooci.h,_ooci.cpp,_mysql.h,_mysql.cpp,_postgresql.h,_postgresql.cpp

    文章目录 1._ooci.h 2._ooci.cpp 3._mysql.h 4._mysql.cpp 5._postgresql.h 6._postgresql.cpp 1._ooci.h //con ...

  2. 信息学奥赛一本通 2047:【例5.16】过滤空格 | OpenJudge NOI 1.7 23:过滤多余的空格

    [题目链接] ybt 2047:[例5.16]过滤空格 OpenJudge NOI 1.7 23:过滤多余的空格 [题目考点] 1. 字符数组 2. string类 3. 计数 [题解代码] 解法1: ...

  3. 信息学奥赛一本通 2073:【例2.16 】三角形面积

    [题目链接] ybt 2073:[例2.16 ]三角形面积 [题目考点] 1. 算术应用题 2. 海伦公式求三角形面积 3. 输出浮点数a保留x位小数 printf(%.xf, a); cout< ...

  4. 信息学奥赛一本通(2073:【例2.16 】三角形面积)

    2073:[例2.16 ]三角形面积 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 61     通过数: 49 [题目描述] 传说古代的叙拉古国王海伦二世发现的 ...

  5. 信息学奥赛一本通(2047:【例5.16】过滤空格)

    2047:[例5.16]过滤空格 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 755     通过数: 544 [题目描述] 过滤多余的空格.一个句子中也许有多 ...

  6. 信息学奥赛一本通(2030:【例4.16】找素数)

    2030:[例4.16]找素数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 883     通过数: 625 [题目描述] 输出正整数aa到bb之间的所有素数. ...

  7. 信息学奥赛一本通 1272:【例9.16】分组背包

    [题目链接] ybt 1272:[例9.16]分组背包 [题目考点] 1. 动态规划:分组背包 [解题思路] 分组背包问题,特点是:每组中的物品最多可以取一件 1. 状态定义 集合:放入背包的物品方案 ...

  8. 【信息学奥赛】2073:【例2.16 】三角形面积(C++)

    今天来让我们来继续分析信息学奥赛一本通的第四十三题,也就是要按照题目的要求利用海伦公式求出三角形面积.(并且,看了我的文章的人只有少数人点了赞,如果你觉得我写的好,或对你有帮助的话,请点赞!!!并收藏 ...

  9. 一本通2073:【例2.16 】三角形面积

    2073:[例2.16 ]三角形面积 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 3958     通过数: 2745 [题目描述] 传说古代的叙拉古国王海伦二 ...

最新文章

  1. C# 最快的逐一打印斐波那契结果数列的算法
  2. 「咖啡馆」里的任正非:开放的技术和商业,不会遵循「丛林法则」
  3. Debian6 Squeeze上安装xen
  4. 微软职位内部推荐-Software Engineer II
  5. Python常用模块之random模块
  6. 在Windows中为文件添加“可执行”权限(chmod +x 文件名 不起作用)
  7. 详解7类Python运算符及代码举例
  8. ASP.NET Web开发框架之七 开发流程与模式
  9. vsftpd 创建虚拟用户
  10. mysql in从数据库取数_MySQL数据库中 where in 用法详解
  11. python封装为php库,从PHP运行Python脚本作为库
  12. 分治算法求螺丝螺母匹配问题
  13. as常用固定搭配_as固定短语搭配
  14. mtk blog --MTK Android 之MT6577驱动笔记
  15. 指数族分布(2)——对数配分函数和MLE与充分统计量
  16. 蓝牙BLE设备连接与通信
  17. CardView使用详解
  18. 【渝粤教育】国家开放大学2018年秋季 2019T统计学原理 参考试题
  19. 在使用DTX-1800测试网线(特别是短跳线),回波损耗为负值,为什么结果是PASS?
  20. Mybatis概念以及源码分析

热门文章

  1. Python练习题 001:4个数字求不重复的3位数
  2. 10分钟学会理解和解决MySQL乱码问题
  3. 【转载】关于错误:ASP.NET The URL-encoded form data is not valid. .
  4. [CSS]BlendTrans滤镜
  5. 实验8.2 指针与字符串 7-2 字符串排序
  6. Java黑皮书课后题第6章:**6.29(双素数)双素数是指一对差值为2的素数。例如,3和5就是一对双素数,5和7是一对双素数,而11和13也是一对双素数。编写程序,找出小于1000的所有双素数
  7. 迅雷2014校园招聘笔试题
  8. 【2012百度之星/资格赛】F:百科蝌蚪团
  9. Hadoop常用操作汇总
  10. AM8不能下任何载附件及所有聊天记录无法登记