临时用户3.14159 发表于 2022-7-30 12:32:38

从文本中获取数据

最近在写一个位图字体管理类(虽然现在位图字体并不常见了)
我是使用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:02:45

本帖最后由 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]
查看完整版本: 从文本中获取数据