c语言 static结构体,C语言实现动态结构体数组
C语言实现动态结构体数组
祖仙教小凡仙 海鲨数据库架构师
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 < 0 )
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]固定数组,只能使用charpchar指针来指向字符数组.
第二层就是 结构体dbconf_conten 因为结构体里的成员是char 指针,是第一层.
那么结构体成员的9个指针,也需要内存. 读第二个结构体时,会覆盖前面的指针;
那就需要保留前一个结构体9个指针,那么它就需要分配内存.
第三层 是指向结构体数组的指针 Tdbconf_conten* p
函数参数 一般是值传和地址传. 可C语言大量的地址传, 传地址给函数,可以让函数直接修改主函数的变量值,一方面是性能,二是函数可以返回多个参数.
函数返回值一般是用于返回函数的执行状态,无论是int 还是voidchar
当然也有特殊情况,比如我们这里无法在主调函数分配内存再传给函数!
只能在函数里分配好了内存,再返回给主调函数,这里必须使用静态关键字,告诉函数,当函数退出的时候不能释放该内存!
最后要在主函数用完后逐步循环释放内存
c语言 static结构体,C语言实现动态结构体数组相关推荐
- c语言动态生成结构体结构,C语言实现动态结构体数组
C语言实现动态结构体数组 原因是因为以前使用C++来实现的,主要用VERCTOR C++标准库的失代器 而不是纯C:C++是C语言的超集,除了包含C外,还有C++各种新语法,新库! 不过虽然C++用起 ...
- c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事
一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...
- c语言程序设计指针进阶,C语言及程序设计进阶例程-15 指向结构体的指针
贺老师教学链接 C语言及程序设计进阶 本课讲解 指向结构体变量的指针的应用 #include #include struct Student { int num; char name[12]; ch ...
- c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt
<<结构体与共同体>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<结构体与共同体>PPT课件.ppt(44页珍藏版)>请在装配图网上搜索. 1 ...
- 一文攻破结构体-C语言
一文攻破结构体-C语言 1 什么是结构体 1.1 结构体类型 结构体(structure)是由不同类型数据组成的组合型的数据结构,可以看做变量的集合.结构体也是一个数据类型,就像和 int.char一 ...
- c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)
来源:网络,排版整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.结构体和其他类型基础数 ...
- 【精华文】C语言结构体特殊情况分析:结构体指针 / 基本数据类型指针,指向其他结构体
参考链接:Structure pointer pointing to different structure instance 注:可以查看此篇的问题和唯一的回复,那是相对正确的,不要看comment ...
- c语言事件结构体,C语言结构体史上最详细的讲解
struct结构体数据类型 前言 我们知道,在C语言中有一些基本的数据类型,如char int float long double string(c99) 等等数据类型,他们可以表示一些事物的基本属性 ...
- 结构体嵌套结构体c语言,结构体的相互嵌套
编程时要用到C语言中结构体的自引用,由于用的少,学得时候也没在意,趁用到,回忆一下. 结构体的自引用(self reference),就是在结构体内部,包含指向自身类型结构体的指针. 结构体的相互引用 ...
最新文章
- 微软聘请游说公司为收购雅虎作势
- One Class SVM 对于样本不均衡处理思路——拿出白样本建模,算出outlier,然后用黑去检验效果...
- 从老赖们“维权”,看拍拍贷的底色
- Cpp / 右值、纯右值、将亡值
- 利用FormData对象实现AJAX文件上传功能及后端实现
- php追加数据,php追加数据到mysql
- fastdfs-02-上传与下载流程
- via浏览器下载路径_Via安卓浏览器(软件篇)
- 【整理分享1】PHP中exit()与die()的区别
- 适合做软件官网展示的源码
- 《微积分:一元函数积分学》——基本积分表
- 如何利用python画一些简单的图形
- 03、订单商品信息表.sql
- Unity个人游戏开发总结
- linux 使用设备树点亮LED 实战
- A State-of-the-Art Survey on Deep Learning Theory and Architectures论文翻译分析
- 有道云笔记linux使用教程,办公必备神器系列五:云笔记:为知笔记、印象笔记、有道云笔记...
- CSS3自定义滚动条样式 -webkit-scrollbar
- Windows下文件或文件夹不能删除时的解决办法
- dingtalk 一个让钉钉服务端开发更简单的golang工具库
热门文章
- Web信息系统采用浏览器 服务器结构,基于web浏览器服务器框架体系教材管理系统.doc...
- html隐藏qq右上角三个点,qq聊天出现这“3个小标志”,你们多半“坠入爱河”,隐藏不住...
- 比较好的学习网站:易百教程网
- X-Frame-Options响应头防点击劫持
- 手机卡如何注销,解析大全来了
- oracle数据库函数mod,oracle数据库常用函数
- 人行招生计算机专业,学计算机的在中国人民银行干什么样的工作?
- 输入姓名,问好,字符切片
- LOST2-Linux机维巡检项目管理工具
- Nodejs 快速入门教程