【 在 dajun 的大作中提到: 】
: 真正上古代码,一群真正智障在改.
: 比如:
: [code=c]
: ...................
用模板技术,可惜发不出来。发个短的吧,道理是一样的。
extern T_PkgType route_file_tpl[];//这个是模板
typedef struct {//这个是结构。
int beg_acccode;
int end_acccode;
char rt_seq;
double rate;
char route[4001];
} route_file_stu;
T_PkgType route_file_tpl[]={//模板
{CH_INT,sizeof(int),"beg_acccode",0,-1},
{CH_INT,sizeof(int),"end_acccode"},
{CH_TINY,1,"rt_seq"},
{CH_DOUBLE,sizeof(double),"rate","%6.四lf"},
{CH_CHAR,4001,"route"},
{-1,0,0,0}
};
static int ldroute(FILE *fd)
{
char buf[10240];
int lstotal,total,ret,commitnum=0;
route_file_stu rec;//就是这个结构
。。。。。。
for(num=0;!ferror(fd);) {
if(!fgets(buf,sizeof(buf),fd)) break;
if(*buf=='#') {continue;}
TRIM(buf);
pkg_dispack(&rec,buf,route_file_tpl,';');//填充这个结构,第三个参数是模板,第四个参数是分隔符。
数据长这样:
125;215;2;0.295;125-124-123-122-121-120-119-553-551-549-547-545-543-215
有很多很多行。
填充用的dispack长这样,填充结构,啥结构都行,配好模板。:
int pkg_dispack(void *net_struct,char *buf,T_PkgType *pkg_type,char delimit)
{
char *cp;
register char *cp1;
char dml[2];
T_PkgType *typ;
*dml=delimit;
dml[1]=0;
cp=buf;
if(!cp||!*cp) return 0;
if(pkg_type->offset<0) set_offset(pkg_type);//计算模板里每个成员的offset
for(typ=pkg_type;typ->type>-1;typ++){ //遍历模板,循环处理每一个成员
if(typ->bindtype&NOSELECT) continue;
if(typ->type==CH_STRUCT) {
cp+=pkg_dispack((char *)net_struct+typ->offset,cp,(T_PkgType *)typ->format,delimit);
continue;
}
cp1=cp;
cp=stptok(cp,0,0,dml);//按分隔符切片。
if(*cp==delimit) *cp++=0;
put_str_one(net_struct,cp1,typ,delimit);//关键在这里,按类型填充一个成员。typ就是该成员的模板
if(!*cp) break;
}
※ 修改:·ylh1969 于 Feb 19 22:30:12 2025 修改本文·[FROM: 221.218.60.*]
※ 来源:·水木社区
http://www.mysmth.net·[FROM: 221.218.60.*]
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*