鱼C论坛

 找回密码
 立即注册
查看: 2445|回复: 1

从文本中获取数据

[复制链接]
发表于 2022-7-30 12:32:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近在写一个位图字体管理类(虽然现在位图字体并不常见了)
我是使用BMFont来生成的位图和字体库 请问我应当如何高效的分析字体库并获取其中的数据

这里是一个使用BMFont生成的 1 到 10 的位图字体的字体库文件 对应的字体位图就不贴上了(这只是一个基本的字体库 其实在一些字体库后面还会有字符之间的像素级的调整的信息)

  1. 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  // 这是字体的基本信息
  2. common lineHeight=32 base=26 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0                                 // 这是字体中字符的基本信息
  3. page id=0 file="test_0.tga"
  4. chars count=10
  5. char id=48   x=0     y=0     width=14    height=21    xoffset=0     yoffset=6     xadvance=15    page=0  chnl=15
  6. char id=49   x=101   y=0     width=8     height=20    xoffset=2     yoffset=6     xadvance=15    page=0  chnl=15
  7. char id=50   x=73    y=0     width=13    height=20    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
  8. char id=51   x=45    y=0     width=13    height=21    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
  9. char id=52   x=110   y=0     width=16    height=19    xoffset=-1    yoffset=7     xadvance=15    page=0  chnl=15
  10. char id=53   x=87    y=0     width=13    height=20    xoffset=1     yoffset=7     xadvance=15    page=0  chnl=15
  11. char id=54   x=59    y=0     width=13    height=21    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
  12. char id=55   x=127   y=0     width=13    height=19    xoffset=1     yoffset=7     xadvance=15    page=0  chnl=15
  13. char id=56   x=15    y=0     width=14    height=21    xoffset=0     yoffset=6     xadvance=15    page=0  chnl=15
  14. char id=57   x=30    y=0     width=14    height=21    xoffset=0     yoffset=6     xadvance=15    page=0  chnl=15
复制代码


因为这是第三方程序(BMFont)生成的字体库 所以我是不是不用写语法分析器什么的。。。
在github似乎没有找到什么合适的库 希望路过的都能提一点意见 当然 最主要还是"高效"
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-7-30 15:02:45 | 显示全部楼层
本帖最后由 jackz007 于 2022-7-30 15:07 编辑

    x.c
  1. #include <stdio.h>

  2. int items(char s[])
  3. {
  4.         int c , i                                                   ;
  5.         for(i = 0 ; s[i] == ' ' || s[i] == '\t' ; i ++)             ;
  6.         for(c = 0 ; s[i] ; c ++) {
  7.                 for(; s[i] && s[i] != ' ' && s[i] != '\t' ; i ++)   ;
  8.                 for(; s[i] == ' ' || s[i] == '\t' ; i ++)           ;
  9.         }
  10.         return c                                                    ;
  11. }

  12. char * next(char s[])
  13. {
  14.         int i                                                       ;
  15.         for(i = 0 ; s[i] == ' ' || s[i] == '\t' ; i ++)             ;
  16.         for(; s[i] && s[i] != ' ' && s[i] != '\t' ; i ++)           ;
  17.         for(; s[i] == ' ' || s[i] == '\t' ; i ++)                   ;
  18.         if(s[i]) return & s[i]                                      ;
  19.         else return NULL                                            ;
  20. }

  21. int getvalue(char s[])
  22. {
  23.         int i , v = -1                                              ;
  24.         for(i = 0 , v = -1 ; s[i] && s[i] != '=' ; i ++)            ;
  25.         if(s[i]) sscanf(& s[i + 1] , "%d" , & v)                    ;
  26.         return v                                                    ;
  27. }

  28. int main(void)
  29. {
  30.         FILE * fp                                                   ;
  31.         int d[8000][10] , i , j , n                                 ;
  32.         char s[2048] , * p                                          ;
  33.         if(fp = fopen("x.txt" , "r")) {
  34.                 fgets(s , 2048 , fp)                                ;
  35.                 for(i = 0 ; ! feof(fp) ;) {
  36.                         if(items(s) == 11) {
  37.                                 p = next(s)                         ;
  38.                                 for(j = 0 ; j < 10 && p ; j ++) {
  39.                                         d[i][j] = getvalue(p)       ;
  40.                                         p = next(p)                 ;
  41.                                 }
  42.                                 i ++                                ;
  43.                         }
  44.                         fgets(s , 2048 , fp)                        ;
  45.                 }
  46.                 fclose(fp)                                          ;
  47.                 for(n = i , i = 0 ; i < n ; i ++) {
  48.                         printf("char id = %-2d" , d[i][0])          ;
  49.                         printf(" x = %-3d" , d[i][1])               ;
  50.                         printf(" y = %-3d" , d[i][2])               ;
  51.                         printf(" weight = %-2d" , d[i][3])          ;
  52.                         printf(" height = %-2d" , d[i][4])          ;
  53.                         printf(" xoffset = %-2d" , d[i][5])         ;
  54.                         printf(" yoffset = %-2d" , d[i][6])         ;
  55.                         printf(" xadvance = %-2d" , d[i][7])        ;
  56.                         printf(" page = %-2d" , d[i][8])            ;
  57.                         printf(" chnl = %-2d\n" , d[i][9])          ;
  58.                 }
  59.         } else {
  60.                 fprintf(stderr , "无法打开输入文件!\n")            ;
  61.         }
  62. }
复制代码

    x.txt
  1. 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  // 这是字体的基本信息
  2. common lineHeight=32 base=26 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0                                 // 这是字体中字符的基本信息
  3. page id=0 file="test_0.tga"
  4. chars count=10
  5. char id=48   x=0     y=0     width=14    height=21    xoffset=0     yoffset=6     xadvance=15    page=0  chnl=15
  6. char id=49   x=101   y=0     width=8     height=20    xoffset=2     yoffset=6     xadvance=15    page=0  chnl=15
  7. char id=50   x=73    y=0     width=13    height=20    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
  8. char id=51   x=45    y=0     width=13    height=21    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
  9. char id=52   x=110   y=0     width=16    height=19    xoffset=-1    yoffset=7     xadvance=15    page=0  chnl=15
  10. char id=53   x=87    y=0     width=13    height=20    xoffset=1     yoffset=7     xadvance=15    page=0  chnl=15
  11. char id=54   x=59    y=0     width=13    height=21    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
  12. char id=55   x=127   y=0     width=13    height=19    xoffset=1     yoffset=7     xadvance=15    page=0  chnl=15
  13. char id=56   x=15    y=0     width=14    height=21    xoffset=0     yoffset=6     xadvance=15    page=0  chnl=15
  14. char id=57   x=30    y=0     width=14    height=21    xoffset=0     yoffset=6     xadvance=15    page=0  chnl=15
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. char id = 48 x = 0   y = 0   weight = 14 height = 21 xoffset = 0  yoffset = 6  xadvance = 15 page = 0  chnl = 15
  4. char id = 49 x = 101 y = 0   weight = 8  height = 20 xoffset = 2  yoffset = 6  xadvance = 15 page = 0  chnl = 15
  5. char id = 50 x = 73  y = 0   weight = 13 height = 20 xoffset = 1  yoffset = 6  xadvance = 15 page = 0  chnl = 15
  6. char id = 51 x = 45  y = 0   weight = 13 height = 21 xoffset = 1  yoffset = 6  xadvance = 15 page = 0  chnl = 15
  7. char id = 52 x = 110 y = 0   weight = 16 height = 19 xoffset = -1 yoffset = 7  xadvance = 15 page = 0  chnl = 15
  8. char id = 53 x = 87  y = 0   weight = 13 height = 20 xoffset = 1  yoffset = 7  xadvance = 15 page = 0  chnl = 15
  9. char id = 54 x = 59  y = 0   weight = 13 height = 21 xoffset = 1  yoffset = 6  xadvance = 15 page = 0  chnl = 15
  10. char id = 55 x = 127 y = 0   weight = 13 height = 19 xoffset = 1  yoffset = 7  xadvance = 15 page = 0  chnl = 15
  11. char id = 56 x = 15  y = 0   weight = 14 height = 21 xoffset = 0  yoffset = 6  xadvance = 15 page = 0  chnl = 15
  12. char id = 57 x = 30  y = 0   weight = 14 height = 21 xoffset = 0  yoffset = 6  xadvance = 15 page = 0  chnl = 15

  13. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 20:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表