一直以来,我对C语言充满敬畏,毕竟C语言如同“造物主”般的存在,不少流行的编程语言、数据库等都是由C语言编写出来的,一直梦想自己是使用C语言的高手。记得读书时教C语言的老师曾经说过:“计算机世界里,万物皆C,没学过C语言是一种莫大的遗憾”。
毕业参加工作了,虽然不使用C语言开发,心里总有那么一点小遗憾。因此闲暇时就会用C语言去实现一些功能,毕竟C语言没那么多包,很多时候都需要靠自己编写。
本次使用C调用webservice实现了航班查询的功能,大致总结如下:
1、使用开放的webservice接口
2、返回i的数据保存到mariadb数据库中
3、具备日志记录功能,可以记录返回报文、解析数据日志等
4、由于没搞定gsoap和libxml2,因此调用webservice引用了shell命令curl,解析xml时就是采用普通的文件读取方式。换言之,该功能在linux下使用,如fedora31
5、编写过程中,C语言处理字符串真的好忧伤,极其怀念Java,Go,Python对字符串的处理
6、光学会C还没法正常实现,还必须熟练系统。只有熟练系统了才知道如何加载必要的包,比如连接mariadb的h文件
代码如下:
头文件airline.h
#include <mysql/mysql.h>
#ifndef AIRLINESCHEDULE_AIRLINE_H
#define AIRLINESCHEDULE_AIRLINE_H
void str_replace(char* cp,int n,char* str);
int produce_time(char* current_time);
void get_regular_data(char* file_name,char* start_city,char* arrive_city,char* query_date);
char *a_trim(char *str);
void save_airline_info(char* text_file,char* start_city,char* arrive_city,char* query_date);
MYSQL con_mariadb();
void close_mariadb_con(MYSQL *con);
void close_mariadb_result(MYSQL_ROW row);
#endif
// main
main函数
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include "head/airline.h"
int main()
{
printf("----------航班查询系统---------\n");
char nowTime[32] = {
0};
produce_time(nowTime);
char file_head[] = "airline";
char file_suffix[] = ".xml";
char* file_name;
file_name = strcat(strcat(file_head,nowTime),file_suffix);
FILE *fp_write = fopen(file_name,"a");
char start_city[] = "桂林";
char arrive_city[] = "杭州";
char query_date[] = "2020-3-24";
char command[] = "curl -d \"startCity=${start_city}&lastCity=${arrive_city}&theDate=${query_date}&userID=\" http://ws.webxml.com.cn/webservices/DomesticAirline.asmx/getDomesticAirlinesTime";
char s_city[] = "${start_city}";
char a_city[] = "${arrive_city}";
char q_date[] = "${query_date}";
char* p;
int counter = 0;
p = strstr(command,s_city);
while(p)
{
counter++;
str_replace(p,strlen(s_city),start_city);
p = p+strlen(start_city);
p = strstr(p,s_city);
}
p = strstr(command,a_city);
counter = 0;
while(p)
{
counter++;
str_replace(p,strlen(a_city),arrive_city);
p = p+strlen(arrive_city);
p = strstr(p,a_city);
}
p = strstr(command,q_date);
counter = 0;
while(p)
{
counter++;
str_replace(p,strlen(q_date),query_date);
p = p+strlen(query_date);
p = strstr(p,q_date);
}
FILE *fp;
int buf;
fp = popen(command,"r");
buf = fgetc(fp);
fputc(buf,fp_write);
while(buf != EOF)
{
putchar(buf);
buf = fgetc(fp);
fputc(buf, fp_write);
}
fclose(fp);
printf("关闭webservice连接...\n");
fclose(fp_write);
printf("保存并关闭%s...\n",file_name);
get_regular_data(file_name,start_city,arrive_city,query_date);
return 0;
}
// get_current_time
get_current_time函数
#include <time.h>
#include <string.h>
int produce_time(char* current_time)
{
char year[5] = {
0};
char month[5] = {
0};
char day[5] = {
0};
char hour[5] = {
0};
char min[5] = {
0};
char second[5] = {
0};
time_t current;
struct tm* time_now;
time(¤t);
time_now = localtime(¤t);
strftime(year,sizeof(year),"%Y",time_now);
strftime