C语言实现动态结构体数组

原因是因为以前使用C++来实现的,主要用VERCTOR C++标准库的失代器

而不是纯C;C++是C语言的超集,除了包含C外,还有C++各种新语法,新库!

不过虽然C++用起来简单,开发效率高,不过相对C语言来说运行速度慢,占用内存大。

最烦得就是编译速度贼慢!

以前小仙使用C++BUILDER 开发WINDOWS桌面应用,基本上编译需要5分钟时间。

而最近编译MYSQL 8.0.20 DEBUG版本,编译近6个小时!就MYSQLD和另外个文件最慢,反复读写硬盘。

而且这两个文件都500-600MB. 而PG源码编译才20分钟就完成了。

MYSQL的C++源码看起来像是看抓妖玄学,鬼画桃符,又跳来跳去。PG就非常清爽!

另外PG基本上概念和ORACLE接近!

这次我要实现读取配置文件的参数,这参数是数据源配置,而且是多个!

这些数据库在私有云上的PDB,每个环境,每个项目,每个微服务一个

那么这样数据源是很多的。这样可以装进数组中。

比如长的这样子

CLASSA=DEV

CLASSB=GOODS

CLASSC=ACCOUNT

CLASSD=小凡仙

USER=ROOT

PASSWD=123456

IP=192.168.3.31

PORT=3306

DBNAME=SHARKDB

CLASSA=TEST

CLASSB=GOODS

CLASSC=ACCOUNT

CLASSD=小凡仙

USER=ROOT

PASSWD=123456

IP=192.168.4.31

PORT=3306

DBNAME=SHARKDB

/** File:   main.cpp

* Author: zengfankun@小凡仙

*

* Created on 2020年8月13日, 下午4:11*/

#include

#include

#include

//定义配置文件结构体类型

typedef struct

{

char* pclassA;

char* pclassB;

char* pclassC;

char* pclassD;

char* pUser;

char* pPassword;

char* pIP;

char* pPort

char* pDBName;

} Tdbconf_conten;

void Load_Conf(char* pFileName);//读入配置文件

Tdbconf_conten* GetDBconfArray( FILE* pFileHandle);//返回结构体数组

int strleftcpy(char* pDest, char* pSrc,int n);//复制字符串左边

int strsub(char* pDest,const char* pSrc,int post,int size); //复制字符串任意位置

int main(int argc, char** argv) //sqlid classA classB classC dbname{

char FileName[]="./conf/db.conf";

char caSubStr[10];

Load_Conf(FileName);

strleftcpy(caSubStr,FileName,5);

printf("%s\n",caSubStr);

strsub(caSubStr,FileName,8,7);

printf("%s\n",caSubStr);

}

int strleftcpy(char* pDest, char* pSrc,int n){

int len= strlen(pSrc);

if(n>len)

n=len;

while (n--)

{

*(pDest++)=*(pSrc++);

}

*(pDest++)='\0'; //后面打入字符串结束标志

return strlen(pDest);

}

int strsub(char* pDest,const char* pSrc,int post,int size){

int len = strlen(pSrc);

if ( size > len )

size = len - post;

if ( post

size = 0;

if ( size > len )

return 0;

pSrc =pSrc+post-1; //数组下标是从0开始,所以要减1

while (size--)

{

*(pDest++)=*(pSrc++);  //步进再赋值

}

*(pDest++)='\0';         //后面补结束标志

return 1;

}

void Load_Conf(char* pFileName)//装入配置文件{

FILE* fpFileHandle = NULL;

Tdbconf_conten* pDBCONF_LIST;

int iFileRow;

char buff[255];

fpFileHandle = fopen(pFileName,"r");

if (fpFileHandle != NULL)

{

//fgets(buff,256,fpFileHandle);

//printf("%s have row num:%d\n",pFileName,iFileRow);

pDBCONF_LIST=GetDBconfArray(fpFileHandle);

if(pDBCONF_LIST!=NULL)

{

printf("arrayp[0].ClassA is:%s\n",pDBCONF_LIST[0].pclassA);

printf("arrayp[1].ClassA is:%s\n",pDBCONF_LIST[1].pclassA);

printf("arrayp[0].ClassB is:%s\n",pDBCONF_LIST[0].pclassB);

printf("arrayp[1].ClassB is:%s\n",pDBCONF_LIST[1].pclassB);

}

}

fclose(fpFileHandle);

fpFileHandle=NULL;

}

Tdbconf_conten* GetDBconfArray( FILE* pFileHandle)//暂时没有实现读取配置文件代码{

static Tdbconf_conten* pDBconf_List;   //必须定义静态才能返回给主调函数使用,一般C规范不建议这样做

pDBconf_List=(Tdbconf_conten*) malloc(sizeof(Tdbconf_conten)*1); //分配内存

pDBconf_List[0].pclassA="Proc";           //使用数组下标来赋值,结构体采用点号 pclassA也是CHAR 指针 可以直接指向字符串

pDBconf_List[0].pclassB="Eorc";

pDBconf_List=(Tdbconf_conten*) realloc (pDBconf_List,sizeof(Tdbconf_conten)*1);  //分配第二块内存,注意pDBconf_List带入

pDBconf_List[1].pclassA="ProcX";

pDBconf_List[1].pclassB="EorcX";

return pDBconf_List;                //返回内存指针

}//设计不完善的读取文件

void ReadFile(){

char buff[2048]; //行临时CHAR ARRAY

char* pKey; //KEY

static char* pContent; //VALUE 这个要返回

if (pFileHandle != NULL)

{

if(!feof(pFileHandle))

{

fgets(buff,2049,pFileHandle); //读取2049字符遇\0 \n 就结束

buff_size=strlen(buff);     //获得本次读取字符个数

for (i=0;i++;i

{                          //01234567

//printf("%c",buff[i]);

if (buff[i]=='=') //如果找到了等号前面就是KEY,后面就是VALUE

{

pKey=(char *)malloc( i * sizeof(char) ); //i位置 原本i是等号位置需要i-1,又因数组下标从0开始所以i+1,两者勾兑后就是i;

strsub(pKey,buff,1,i);                   //strsub函数从人的习惯1开始 所以i 不用减1

pContent=(char*)malloc ((buff_size-i-1)*sizeof(char));

strsub(pContent,buff,i+2,buff_size-i-1);

if( pContent != NULL)

{

if(strcmp(DBconf_key.classA,pKey)==0)

pdbconf_value.pclassA=pContent;

if(strcmp(DBconf_key.classB,pKey)==0)

pdbconf_value.pclassB=pContent;

if(strcmp(DBconf_key.classC,pKey)==0)

pdbconf_value.pclassC=pContent;

if(strcmp(DBconf_key.classD,pKey)==0)

pdbconf_value.pclassD=pdbconf_value;

if(strcmp(DBconf_key.user,pKey)==0)

pdbconf_value.pUser =pContent;

if(strcmp(DBconf_key.password,pKey)==0)

pdbconf_value.pPassword=pContent;

if(strcmp(DBconf_key.URL,pKey)==0)

pdbconf_value.pConnect=pContent;

if(strcmp(DBconf_key.dbname,pKey)==0)

pdbconf_value.pDBName=pContent;

break;

}

free(pKey);

pKey=NULL;

}

}

除了使用链表外,这个比较方便的数据结构可以实现动态结构体数组.

这里使用了3层,

第一层是VALUE  字符串, 字符串长度不一.不能使用char[9]固定数组,只能使用char* pchar指针来指向字符数组.

第二层就是 结构体dbconf_conten 因为结构体里的成员是char* 指针,是第一层.

那么结构体成员的9个指针,也需要内存. 读第二个结构体时,会覆盖前面的指针;

那就需要保留前一个结构体9个指针,那么它就需要分配内存.

第三层 是指向结构体数组的指针 Tdbconf_conten* p

函数返回值一般是用于返回函数的执行状态,无论是int 还是void* char*

当然也有特殊情况,比如我们这里无法在主调函数分配内存再传给函数!

只能在函数里分配好了内存,再返回给主调函数,这里必须使用静态关键字,告诉函数,当函数退出的时候不能释放该内存!

最后要在主函数用完后逐步循环释放内存

c语言动态生成结构体结构,C语言实现动态结构体数组相关推荐

  1. python3动态生成变量_【转载】 Python动态生成变量

    用Python循环创建多个变量, 如创建 a1=   .a2=   .a3=   .a4=   .a5=    或  self.a1=    .self.a2=   . self.a3= 一. 可以通 ...

  2. org.apache.poi Excel列与行都是动态生成的_网络爬虫:Python动态网页爬虫2种技术方式及示例...

    作者:糖甜甜甜 https://mp.weixin.qq.com/s/5Dwh5cbfjpDfm_FRcpw1Ug 这一讲,我将会为大家讲解稍微复杂一点的爬虫,即动态网页的爬虫. 动态网页技术介绍 动 ...

  3. vue动态生成html元素,Vue.js中的动态html元素

    更新: 基于 this answer,您可以在Vue 2中执行类似的动态模板组件.您实际上可以在计算部分中设置组件规范并使用 :is绑定它 var v = new Vue({ el: '#vue', ...

  4. 给动态生成的id标签添加html,vue动态渲染svg、添加点击事件

    欢迎关注[前端小讴的github],原创技术文章 业务需求(vue项目中) 1.页面展示svg内容 2.监听svg内部的点击事件 3.动态改变svg内部元素的属性和值 html标签 经多次实验,用em ...

  5. 语言软件生成outsid_常用的C语言开发工具有哪些

    编程语言有很多种,主要分为三大类,分别是机器语言.汇编语言.高级语言.计算机只能理解识别二进制代码,也就是0和1.我们用机器语言开发我们得记住计算机所有的指令代码和代码涵义.这样的编程枯燥而繁琐费力, ...

  6. vue动态生成下拉框_解决vue动态下拉菜单 有数据未反应的问题

    问题出现在当时后台数据会返回到data中但是没有出现下拉菜单,查询资料 发现 Vue的this理解有误 jsp 下拉菜单 {{item.plantModelName}} JS new Vue({ el ...

  7. c语言自动生成时间计算天数,C语言计算某月的天数(附带源码)

    这是一个C语言编程实例:给定年份和月份,求该月共有多少天. 问题分析 输入:年份(整数)和月份(整数). 输出:该月份的天数(整数). 一年有 12 个月,其中一.三.五.七.八.十.十二月各有 31 ...

  8. 给动态生成的按钮添加ajax,Ajax/Javascript动态创建按钮的问题

    你没有指定一个事件处理程序,您调用它.函数createButtons马上被调用,并且它返回的任何东西都被赋值给window.onload. window.onload = createButtons( ...

  9. c语言随机生成四则运算10道,c语言编10道四则运算题

    满意答案 qy840430 2013.05.30 采纳率:47%    等级:13 已帮助:4228人 以下代码使用Turbo C做的,不支持汉字#include #include #include ...

  10. 实体类的动态生成(三)

    前言 在 .NET 中主要有两种动态生成并编译的方式,一种是通过 System.Linq.Expressions 命名空间中的 LambdaExpression 类的 CompileToMethod( ...

最新文章

  1. 你知道人工智能为什么这么火?
  2. 采用fdisk在linux进行分区操作
  3. linux 检测日志文件内容变化
  4. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope
  5. Spring Boot、Spring Cloud、Spring Cloud Alibaba版本关系查询
  6. spring的aop准备工作-导包定义通知
  7. 在URL参数中传递复杂对象
  8. iOS UI 18 数据库
  9. vue data数据修改_VUE的数据响应式
  10. Linux 一切皆文件认知
  11. 聊一个不常见的面试题:为什么数据库连接池不采用 IO 多路复用
  12. 计算机无法打印图片,电脑中打印机可以打印文档却无法打印图片如何解决
  13. 力扣:714.买卖股票的最佳时机含手续费
  14. FPGA基础之HLS
  15. 游戏美术设计中,最难的角色人物如何设计才能吸睛?
  16. 打造铜墙铁壁 DDoS攻击全面解析
  17. 《Sass 基础教程》共40节宁皓网课程
  18. 利用hive完成阿里天池大数据音乐预测比赛数据处理工作
  19. 倍福控制电机耦合运动
  20. 微信小程序小说阅读器/在线故事阅读丨可以android studio运行

热门文章

  1. 飞猪的第一个双十一,除了21.7亿你还读到了什么?
  2. .pvr.ccz 与 png 格式 互转的解决方案
  3. 基于ISO13400 (DoIP) 实现车辆刷写
  4. 为什么公司招聘前端会更倾向于应届生?
  5. 微软24小时服务器,微软推出 AnswerDesk 24小时全天候服务网站
  6. 计算机核心论文实验数据,WIREs | 校准心脏研究的核心计算机模型
  7. 计算机平面设计教程,计算机平面设计实用教程 培训课件.ppt
  8. c#操作符operate的用法
  9. pdf批量加水印logo的方法
  10. 企业云办公最佳方案油塔企业云盘