C语言文件指针偏移的使用(点阵字库txt文件取字)

一、导言

C语言中文件读写也是相当重要的一块,在进行二进制文件逐字节读写时,使用C语言会异常好用。文件指针也是个让人抓脑袋的东西,移动文件指针的函数利用好可以有大作用。

二、操作

  1. 文件
    文件结构体定义在 stdio.h 头文件中,使用fopen打开文件后会存储一些相关数据在结构体中。
typedef struct
{
   
   short level;
   unsigned flags;
   char fd;
   unsigned char hold;
   short bsize;
   unsigned char *buffer;
   unsigned ar *curp;
   unsigned istemp;
   short token;
}FILE;
  1. 文件指针操作
    文件指针操作主要有以下几个函数,在进行地址偏移计算时用得到。
    void rewind(FILE *stream); - 设置文件位置为给定流 stream 的文件的开头。
    long int ftell(FILE *stream); - 返回给定流 stream 的当前文件位置。
    int fseek(FILE *stream, long int offset, int whence); - 设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。

三、实战

目标:从点阵字库LiShu56.txt文件中提取某一个汉字。
实现思路:通过汉字的gb2312机内码直接定位到文件中的该汉字起始位置,然后进行循环读写复制。
字库文件格式截图示例
上图即该文件中的格式,为图方便,我直接使用二进制文件查看器,定义了几个基本的偏移量。

#define OFFSET_BASE 98      // 文件首基准位置
#define OFFSET_WORD 3666    // 这是点阵字库中每个字的整体字节量
#define OFFSET_INNER 13     // 这是单个字内部起始到实际字的数据的位置的偏移量

因为该字库文件中收录的字并不是直接从 a1a1 连续到 f7fe 的,所以不能够直接求偏移量然后直接偏移,否则使用 fseek 偏移超过文件指针允许的范围,程序将会陷入卡死(或死循环)的状态。
 
以下为算法流程图:
偏移算法流程图
注释:

  1. OFFSET_BASE 是从文件首到能够读取第一个(CurCode后)gb2312码的位置的偏移量。
  2. OFFSET_WORD 是读完这一gb2312码后到下一个字能够读取gb2312码的位置的偏移量。
  3. OFFSET_INNER 是找到该字后,从读完这一gb2312码的位置到能够读取点阵文本的首位置的偏移量。

实现代码:
该文件基于Windows系统,在Windows系统中中文占用为两个字节(char),在Linux系统中为三个字节。

// 给单个字定位到指定位置
FILE* 
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值