C/C++12天气APP:不同数据建表入表,数据交换(exptables.cpp,ftpputfiles.cpp)
Posted 码农编程录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++12天气APP:不同数据建表入表,数据交换(exptables.cpp,ftpputfiles.cpp)相关的知识,希望对你有一定的参考价值。
文章目录
1.分区预警信号数据:strstr,UpdateStr
1.1 数据说明:.txt后缀可改为.csv后缀
下面是excel软件打开.txt文件(以逗号分隔)。
如下是xml标准格式,前后加< data >标签,每行后加< end1/>,只有标准格式才能用浏览器打开显示。
下面为说明文档:
1.2 建表入表:站点代码改为街道代码,站点名称改为街道名称
// psignallog.cpp封成类
#include "_public.h"
#include "_ooci.h"
#include "_shqx.h"
CLogFile logfile;
CDir Dir;
bool _psignallog();
connection conn;
void EXIT(int sig);
int main(int argc,char *argv[])
if (argc!=5)
printf("\\n本程序用于处理分区预警信号发布日志,并保存到数据库的T_SIGNALLOG表中。\\n");
printf("/oracle/htidc/shqx/bin/psignallog 数据文件存放的目录 日志文件名 数据库连接参数 程序运行时间间隔\\n");
printf("例如:/oracle/htidc/shqx/bin/psignallog /oracle/data/shqx/sdata/wpfiles /oracle/log/shqx/psignallog.log shqx/pwdidc@snorcl11g_128 10\\n");
return -1;
CloseIOAndSignal();
signal(SIGINT,EXIT); signal(SIGTERM,EXIT);
if (logfile.Open(argv[2],"a+")==false)
printf("打开日志文件失败(%s)。\\n",argv[2]); return -1;
logfile.Write("程序启动。\\n");
//1111111111111111111111111111111111111111111111111111111111
while (true)
// logfile.Write("开始扫描目录。\\n");
if (Dir.OpenDir(argv[1],"WP20*.DTB",1000,true,true)==false)
// 扫描数据文件存放的目录,只匹配"WP20*.DTB"
logfile.Write("Dir.OpenDir(%s) failed.\\n",argv[1]); sleep(atoi(argv[4])); continue;
while (true) // 逐个处理目录中的数据文件
if (Dir.ReadDir()==false) break;
if (conn.m_state==0)
if (conn.connecttodb(argv[3],"Simplified Chinese_China.ZHS16GBK")!=0)
logfile.Write("connect database(%s) failed.\\n%s\\n",argv[3],conn.m_cda.message); break;
// logfile.Write("连接数据库成功。\\n");
logfile.Write("开始处理文件%s...",Dir.m_FileName);
if (_psignallog()==false)
logfile.WriteEx("失败。\\n"); break;
if (conn.m_state==1) conn.disconnect();
sleep(atoi(argv[4]));
return 0;
void EXIT(int sig)
logfile.Write("程序退出,sig=%d\\n\\n",sig);
exit(0);
//111111111111111111111111111111111111111111111111111111
bool _psignallog()
CFile File;
if (File.Open(Dir.m_FullFileName,"r")==false)
logfile.Write("(File.Open(%s) failed.\\n",Dir.m_FullFileName); return false;
CSIGNALLOG SIGNALLOG(&conn,&logfile);
char strBuffer[301]; // 读取文件中的每一行记录,写入数据库的表中
while (true)
memset(strBuffer,0,sizeof(strBuffer));
if (File.Fgets(strBuffer,300,true)==false) break; // 从文件中获取一行记录
// 每行预警信号发布的记录的最后都是用"000="结束的。不会得到第一,二行和最后一行
if (strstr(strBuffer,"000=")==0) continue;
UpdateStr(strBuffer," "," ",true); // 把内容中的两个空格替换成一个空格
// logfile.Write("%s\\n",strBuffer);
// 把用逗号分隔的记录拆分到结构体中
if (SIGNALLOG.SplitBuffer(strBuffer)==false) logfile.Write("%s\\n",strBuffer); continue;
// 把vsignallog容器中的值更新到T_SIGNALDATA表中。
long rc=SIGNALLOG.InsertTable();
// 只要不是数据库session的错误,程序就继续。
if ( (rc>=3113) && (rc<=3115) ) return false;
if (rc != 0) logfile.Write("%s\\n",strBuffer); continue;
conn.commit(); // 提交事务
File.CloseAndRemove(); // 关闭文件指针,并删除文件
logfile.WriteEx("成功(total=%d,insert=%d,update=%d,invalid=%d)。\\n",SIGNALLOG.totalcount,SIGNALLOG.insertcount,SIGNALLOG.updatecount,SIGNALLOG.invalidcount);
return true;
关于_shqx.h(增加了struct st_signallog结构体)和_shqx.cpp见文章:https://blog.csdn.net/weixin_43435675/article/details/103476761
WP…0510.DTB时间是05:10:00下面是加了8小时。
2.台风(热带气旋)数据:SplitBuffer,InsertTable
2.1 数据说明:头记录,实况路径
第一行第四个开始
:开始依次气旋序号cyclone(001),国内编号num(1801),热带气旋终结标志ws(0),每行路径间隔小时数hours(6),热带气旋的英文名称t_name(BOLAVEN),数据集形成的日期datasettime(20190319)。
第二行第一个开始
:YYYY年MM月DD日HH时ddatetime(世界时2018021000),强度标记h_level(1),纬度lat(84),经度lon(1435),中心最低气压pres(1008),2分钟平均近中心最大风速wnd(13),(2分钟平均风速owd)。
1.
头记录(第一行)格式如下:
2.
实况路径(第二行往下)(不是预报路径)数据记录格式如下:
2.2 建表入表:AddTime
// typthoon.cpp
#include "_public.h"
#include "_ooci.h"
#include "_shqx.h"
CLogFile logfile;
CDir Dir;
bool _typthon(); //处理数据文件
connection conn;
void EXIT(int sig);
int main(int argc,char *argv[])
if (argc!=5)
printf("\\n本程序用于处理分区预警信号发布日志,并保存到数据库的T_SIGNALLOG表中。\\n");
printf("/oracle/htidc/shqx/bin/typthon 数据文件存放的目录 日志文件名 数据库连接参数 程序运行时间间隔\\n");
printf("例如:/oracle/htidc/shqx/bin/typthon /oracle/data/shqx/sdata/typthon /oracle/log/shqx/typthon.log shqx/pwdidc@snorcl11g_128 10\\n");
return -1;
CloseIOAndSignal();
signal(SIGINT,EXIT); signal(SIGTERM,EXIT);
if (logfile.Open(argv[2],"a+")==false)
printf("打开日志文件失败(%s)。\\n",argv[2]); return -1;
logfile.Write("程序启动。\\n");
//11111111111111111111111111111111111111111111111111111111
while (true)
logfile.Write("开始扫描目录。\\n");
// 扫描数据文件存放的目录,只匹配"CH20*.DTB"
if (Dir.OpenDir(argv[1],"CH*.TXT",1000,true,true)==false)
logfile.Write("Dir.OpenDir(%s) failed.\\n",argv[1]); sleep(atoi(argv[4])); continue;
// 逐个处理目录中的数据文件
while (true)
if (Dir.ReadDir()==false) break;
if (conn.m_state==0)
if (conn.connecttodb(argv[3],"Simplified Chinese_China.ZHS16GBK")!=0)
logfile.Write("connect database(%s) failed.\\n%s\\n",argv[3],conn.m_cda.message); break;
logfile.Write("连接数据库成功。\\n");
logfile.Write("开始处理文件%s...",Dir.m_FileName);
if (_typthon()==false) //处理数据文件
logfile.WriteEx("失败。\\n"); break;
if (conn.m_state==1) conn.disconnect();
sleep(atoi(argv[4]));
return 0;
void EXIT(int sig)
logfile.Write("程序退出,sig=%d\\n\\n",sig);
exit(0);
//111111111111111111111111111111111111111111111111111
bool _typthon()
CFile File;
if (File.Open(Dir.m_FullFileName,"r")==false)
logfile.Write("(File.Open(%s) failed.\\n",Dir.m_FullFileName); return false;
CTYPTHOON TYPTHON(&conn,&logfile);
// 读取文件中的每一行记录
// 写入数据库的表中
char strBuffer[301];
while (true)
memset(strBuffer,0,sizeof(strBuffer));
if (File.Fgets(strBuffer,300,true)==false) break; //从文件中获取一行记录
UpdateStr(strBuffer," "," ",true); //把内容中的两个空格替换成一个空格
// logfile.Write("%s\\n",strBuffer);
// 把用逗号分隔的记录拆分到结构体中
if (TYPTHON.SplitBuffer(strBuffer)==false) logfile.Write("%s拆分失败\\n",strBuffer); continue;
long rc=TYPTHON.InsertTable(); // 把vsignallog容器中的值更新到T_SIGNALDATA表中
if ( (rc>=3113) && (rc<=3115) ) return false; // 只要不是数据库session的错误,程序就继续
if (rc != 0) logfile.Write("%s\\n",strBuffer); continue;
conn.commit();
File.CloseAndRemove();
logfile.WriteEx("成功(total=%d,insert=%d,update=%d,invalid=%d)。\\n",TYPTHON.totalcount,TYPTHON.insertcount,TYPTHON.updatecount,TYPTHON.invalidcount);
return true;
//_shqx.h
#ifndef _SHQX_H
#define _SHQX_H
#include "_public.h"
#include "_ooci.h"
struct st_typthoon1 //实况路径
char ddatetime[21]; // YYYY年, MM月, DD日,HH时(世界时);
char h_level[2]; //强度标记
double lat; // 纬度
double lon; // 经度
char pres[2]; //中心最低气压(hPa);
int wnd; //2分钟平均近中心最大风速(MSW, m/s)
int owd; //2分钟平均风速(m/s)
int t_no; //自定义台风编号,从第0个开始
;
struct st_typthoon //头记录
char cyclone[5]; //气旋序号
char num[5]; //国内编号
char ws[2]; //热带气旋终结标志
char hours[2]; //每行路径间隔小时数, 目前均为6(小时);
char t_name[30]; //热带气旋的英文名称, 名称后加 “(-1)n” 表示副中心及其序号;
char datasettime[21]; //数据集形成的日期
;
class CTYPTHOON
public:
int totalcount,insertcount,updatecount,invalidcount; // 记录总数据、插入数、更新数、无效记录数。
int c;//个数
struct st_typthon m_sttypthon;
struct st_typthon1 m_sttypthon1;
vector<struct st_typthon> vtypthon; // 容器存放一个文件的全部记录
CTYPTHON(connection *conn,CLogFile *logfile);
~CTYPTHON();
void initdata(); // 数据初始化
connection *m_conn;
CLogFile *m_logfile;
int iccount;
sqlstatement stmtsel,stmtins,stmtupt;
// 把记录拆分到vsignallog容器中。
bool SplitBuffer(const char *strBuffer);
// 把vsignallog容器中的值更新到T_SIGNALDATA表中。
long InsertTable();
;
#endif
//_shqx.cpp
#include "_shqx.h"
CTYPTHON::CTYPTHON(connection *conn,CLogFile *logfile)
initdata();
m_conn=conn; m_logfile=logfile;
void CTYPTHON::initdata()
totalcount=insertcount=updatecount=invalidcount=0;
m_conn=0; m_logfile=0;
memset(&m_sttypthon,0,sizeof(struct st_typthon));
memset(&m_sttypthon1,0,sizeof(struct st_typthon1));
CTYPTHON::~CTYPTHON()
//111111111111111111111111111111111111111111111111111111111111111111111
bool CTYPTHON::SplitBuffer(const char *strBuffer)
//把用逗号分隔的记录拆分到m_sttypthon结构中
totalcount++;
// memset(&m_sttypthon1,0,sizeof(struct st_typthon));
CCmdStr CmdStr;
CmdStr.SplitToCmd(strBuffer," ",true);
c= CmdStr.CmdCount();
if(CmdStr.CmdCount()==9)
memset(&m_sttypthon,0,sizeof(struct st_typthon));
CmdStr.GetValue(3,m_sttypthon.cyclone,4);
CmdStr.GetValue(4,m_sttypthon.num,4);
CmdStr.GetValue(5,m_sttypthon.ws,1);
CmdStr.GetValue(6,m_sttypthon.hours,1);
CmdStr.GetValue(7,m_sttypthon.t_name,29);
CmdStr.GetValue(8,m_sttypthon.datasettime,19);
if (CmdStr.CmdCount()==6C/C++8天气APP:Oracle数据库安装,表操作,C语言操作Oracle数据库
C/C++9天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性
C/C++13天气APP:数据挖掘/HTTP协议/非结构化数据存储(filetoblob.cpp),数据管理/监控告警(hsmtable.cpp,tbspaceinfo.cpp)
C/C++15天气APP:服务端(client.cpp,shtqappserver.cpp)
C/C++7天气APP:生成观测数据txt/xml文件(crtsurfdata.cpp),ftp协议及ftp采集模块(_ftp.h,_ftp.cpp,ftpgetfiles.cpp)