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
* 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[]="./f";
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){
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)
{
//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);    //获得本次读取字符个数
{                          //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;
}
}
除了使⽤链表外,这个⽐较⽅便的数据结构可以实现动态结构体数组.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。