鱼C论坛

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

从文本中获取数据

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

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

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

x
最近在写一个位图字体管理类(虽然现在位图字体并不常见了)
我是使用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=0  chnl=15
char id=49   x=101   y=0     width=8     height=20    xoffset=2     yoffset=6     xadvance=15    page=0  chnl=15
char id=50   x=73    y=0     width=13    height=20    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
char id=51   x=45    y=0     width=13    height=21    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
char id=52   x=110   y=0     width=16    height=19    xoffset=-1    yoffset=7     xadvance=15    page=0  chnl=15
char id=53   x=87    y=0     width=13    height=20    xoffset=1     yoffset=7     xadvance=15    page=0  chnl=15
char id=54   x=59    y=0     width=13    height=21    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
char id=55   x=127   y=0     width=13    height=19    xoffset=1     yoffset=7     xadvance=15    page=0  chnl=15
char id=56   x=15    y=0     width=14    height=21    xoffset=0     yoffset=6     xadvance=15    page=0  chnl=15
char id=57   x=30    y=0     width=14    height=21    xoffset=0     yoffset=6     xadvance=15    page=0  chnl=15

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

使用道具 举报

发表于 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[i] == ' ' || s[i] == '\t' ; i ++)             ;
        for(c = 0 ; s[i] ; c ++) {
                for(; s[i] && s[i] != ' ' && s[i] != '\t' ; i ++)   ;
                for(; s[i] == ' ' || s[i] == '\t' ; i ++)           ;
        }
        return c                                                    ;
}

char * next(char s[])
{
        int i                                                       ;
        for(i = 0 ; s[i] == ' ' || s[i] == '\t' ; i ++)             ;
        for(; s[i] && s[i] != ' ' && s[i] != '\t' ; i ++)           ;
        for(; s[i] == ' ' || s[i] == '\t' ; i ++)                   ;
        if(s[i]) return & s[i]                                      ;
        else return NULL                                            ;
}

int getvalue(char s[])
{
        int i , v = -1                                              ;
        for(i = 0 , v = -1 ; s[i] && s[i] != '=' ; i ++)            ;
        if(s[i]) sscanf(& s[i + 1] , "%d" , & v)                    ;
        return v                                                    ;
}

int main(void)
{
        FILE * fp                                                   ;
        int d[8000][10] , i , j , n                                 ;
        char s[2048] , * 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[i][j] = 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[i][0])          ;
                        printf(" x = %-3d" , d[i][1])               ;
                        printf(" y = %-3d" , d[i][2])               ;
                        printf(" weight = %-2d" , d[i][3])          ;
                        printf(" height = %-2d" , d[i][4])          ;
                        printf(" xoffset = %-2d" , d[i][5])         ;
                        printf(" yoffset = %-2d" , d[i][6])         ;
                        printf(" xadvance = %-2d" , d[i][7])        ;
                        printf(" page = %-2d" , d[i][8])            ;
                        printf(" chnl = %-2d\n" , d[i][9])          ;
                }
        } 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=0  chnl=15
char id=49   x=101   y=0     width=8     height=20    xoffset=2     yoffset=6     xadvance=15    page=0  chnl=15
char id=50   x=73    y=0     width=13    height=20    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
char id=51   x=45    y=0     width=13    height=21    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
char id=52   x=110   y=0     width=16    height=19    xoffset=-1    yoffset=7     xadvance=15    page=0  chnl=15
char id=53   x=87    y=0     width=13    height=20    xoffset=1     yoffset=7     xadvance=15    page=0  chnl=15
char id=54   x=59    y=0     width=13    height=21    xoffset=1     yoffset=6     xadvance=15    page=0  chnl=15
char id=55   x=127   y=0     width=13    height=19    xoffset=1     yoffset=7     xadvance=15    page=0  chnl=15
char id=56   x=15    y=0     width=14    height=21    xoffset=0     yoffset=6     xadvance=15    page=0  chnl=15
char id=57   x=30    y=0     width=14    height=21    xoffset=0     yoffset=6     xadvance=15    page=0  chnl=15
        编译、运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

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

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 08:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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