从文本中获取数据
最近在写一个位图字体管理类(虽然现在位图字体并不常见了)我是使用BMFont来生成的位图和字体库 请问我应当如何高效的分析字体库并获取其中的数据
这里是一个使用BMFont生成的 1 到 10 的位图字体的字体库文件 对应的字体位图就不贴上了(这只是一个基本的字体库 其实在一些字体库后面还会有字符之间的像素级的调整的信息)
info face="微软雅黑" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0// 这是字体的基本信息
common lineHeight=32 base=26 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 // 这是字体中字符的基本信息
page id=0 file="test_0.tga"
chars count=10
char id=48 x=0 y=0 width=14 height=21 xoffset=0 yoffset=6 xadvance=15 page=0chnl=15
char id=49 x=101 y=0 width=8 height=20 xoffset=2 yoffset=6 xadvance=15 page=0chnl=15
char id=50 x=73 y=0 width=13 height=20 xoffset=1 yoffset=6 xadvance=15 page=0chnl=15
char id=51 x=45 y=0 width=13 height=21 xoffset=1 yoffset=6 xadvance=15 page=0chnl=15
char id=52 x=110 y=0 width=16 height=19 xoffset=-1 yoffset=7 xadvance=15 page=0chnl=15
char id=53 x=87 y=0 width=13 height=20 xoffset=1 yoffset=7 xadvance=15 page=0chnl=15
char id=54 x=59 y=0 width=13 height=21 xoffset=1 yoffset=6 xadvance=15 page=0chnl=15
char id=55 x=127 y=0 width=13 height=19 xoffset=1 yoffset=7 xadvance=15 page=0chnl=15
char id=56 x=15 y=0 width=14 height=21 xoffset=0 yoffset=6 xadvance=15 page=0chnl=15
char id=57 x=30 y=0 width=14 height=21 xoffset=0 yoffset=6 xadvance=15 page=0chnl=15
因为这是第三方程序(BMFont)生成的字体库 所以我是不是不用写语法分析器什么的。。。
在github似乎没有找到什么合适的库 希望路过的都能提一点意见 当然 最主要还是"高效" 本帖最后由 jackz007 于 2022-7-30 15:07 编辑
x.c
#include <stdio.h>
int items(char s[])
{
int c , i ;
for(i = 0 ; s == ' ' || s == '\t' ; i ++) ;
for(c = 0 ; s ; c ++) {
for(; s && s != ' ' && s != '\t' ; i ++) ;
for(; s == ' ' || s == '\t' ; i ++) ;
}
return c ;
}
char * next(char s[])
{
int i ;
for(i = 0 ; s == ' ' || s == '\t' ; i ++) ;
for(; s && s != ' ' && s != '\t' ; i ++) ;
for(; s == ' ' || s == '\t' ; i ++) ;
if(s) return & s ;
else return NULL ;
}
int getvalue(char s[])
{
int i , v = -1 ;
for(i = 0 , v = -1 ; s && s != '=' ; i ++) ;
if(s) sscanf(& s , "%d" , & v) ;
return v ;
}
int main(void)
{
FILE * fp ;
int d , i , j , n ;
char s , * p ;
if(fp = fopen("x.txt" , "r")) {
fgets(s , 2048 , fp) ;
for(i = 0 ; ! feof(fp) ;) {
if(items(s) == 11) {
p = next(s) ;
for(j = 0 ; j < 10 && p ; j ++) {
d = getvalue(p) ;
p = next(p) ;
}
i ++ ;
}
fgets(s , 2048 , fp) ;
}
fclose(fp) ;
for(n = i , i = 0 ; i < n ; i ++) {
printf("char id = %-2d" , d) ;
printf(" x = %-3d" , d) ;
printf(" y = %-3d" , d) ;
printf(" weight = %-2d" , d) ;
printf(" height = %-2d" , d) ;
printf(" xoffset = %-2d" , d) ;
printf(" yoffset = %-2d" , d) ;
printf(" xadvance = %-2d" , d) ;
printf(" page = %-2d" , d) ;
printf(" chnl = %-2d\n" , d) ;
}
} else {
fprintf(stderr , "无法打开输入文件!\n") ;
}
}
x.txt
info face="微软雅黑" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0// 这是字体的基本信息
common lineHeight=32 base=26 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 // 这是字体中字符的基本信息
page id=0 file="test_0.tga"
chars count=10
char id=48 x=0 y=0 width=14 height=21 xoffset=0 yoffset=6 xadvance=15 page=0chnl=15
char id=49 x=101 y=0 width=8 height=20 xoffset=2 yoffset=6 xadvance=15 page=0chnl=15
char id=50 x=73 y=0 width=13 height=20 xoffset=1 yoffset=6 xadvance=15 page=0chnl=15
char id=51 x=45 y=0 width=13 height=21 xoffset=1 yoffset=6 xadvance=15 page=0chnl=15
char id=52 x=110 y=0 width=16 height=19 xoffset=-1 yoffset=7 xadvance=15 page=0chnl=15
char id=53 x=87 y=0 width=13 height=20 xoffset=1 yoffset=7 xadvance=15 page=0chnl=15
char id=54 x=59 y=0 width=13 height=21 xoffset=1 yoffset=6 xadvance=15 page=0chnl=15
char id=55 x=127 y=0 width=13 height=19 xoffset=1 yoffset=7 xadvance=15 page=0chnl=15
char id=56 x=15 y=0 width=14 height=21 xoffset=0 yoffset=6 xadvance=15 page=0chnl=15
char id=57 x=30 y=0 width=14 height=21 xoffset=0 yoffset=6 xadvance=15 page=0chnl=15
编译、运行实况:
D:\\C>g++ -o x x.c
D:\\C>x
char id = 48 x = 0 y = 0 weight = 14 height = 21 xoffset = 0yoffset = 6xadvance = 15 page = 0chnl = 15
char id = 49 x = 101 y = 0 weight = 8height = 20 xoffset = 2yoffset = 6xadvance = 15 page = 0chnl = 15
char id = 50 x = 73y = 0 weight = 13 height = 20 xoffset = 1yoffset = 6xadvance = 15 page = 0chnl = 15
char id = 51 x = 45y = 0 weight = 13 height = 21 xoffset = 1yoffset = 6xadvance = 15 page = 0chnl = 15
char id = 52 x = 110 y = 0 weight = 16 height = 19 xoffset = -1 yoffset = 7xadvance = 15 page = 0chnl = 15
char id = 53 x = 87y = 0 weight = 13 height = 20 xoffset = 1yoffset = 7xadvance = 15 page = 0chnl = 15
char id = 54 x = 59y = 0 weight = 13 height = 21 xoffset = 1yoffset = 6xadvance = 15 page = 0chnl = 15
char id = 55 x = 127 y = 0 weight = 13 height = 19 xoffset = 1yoffset = 7xadvance = 15 page = 0chnl = 15
char id = 56 x = 15y = 0 weight = 14 height = 21 xoffset = 0yoffset = 6xadvance = 15 page = 0chnl = 15
char id = 57 x = 30y = 0 weight = 14 height = 21 xoffset = 0yoffset = 6xadvance = 15 page = 0chnl = 15
D:\\C>
页:
[1]