文本阅读的功能实现

来源:互联网 发布:东方财富mac版使用教程 编辑:程序博客网 时间:2024/05/18 04:04

由于硬件的限制导致不可能一次性将txt文档全部都读取出来。需要一段一段将其读取出来。现设定每次读取的大小为FILESIZE。而txt文档中会是ASCII码和GB2312码的集合。ASCII码占用一个字节,而GB2312占用两个字节。每次读取FILESIZE大小的内容时,可能会导致将一个GB2312的字符分成两半。而此一次读取时,导致第一个字符将是不可预定的内容。

a我是程序员。b我也是程序员

假设以上是文本内容,FILESIZE大小为8, 那么第一次读取文件时,会在“序”的高字节结束,第二次读取的时候会从“序”的低字节开始,显然第一个字符将不是我们想要的字符,它由“序”的低字节和“员”的高字节组成。这样再将GB2312转换成unicode码然后显示时会出现乱码的情况。

那么该如何来处理这种情况呢。每次读取一次文本文件会将其转换成unicode码去显示,在转换的过程中,当最后一个字符不是完整的一个字是(或是ASCII码,或是GB2312码,汉字区的“高位字节”的范围是0xB0-0xF7,“低位字节”的范围是0xA1-0xFE)。可以设定一个标志,这个标志可以指示下一次读取文件时是否要将位置提前一个字节(相应FILESIZE要+1)。这样就可以解决乱码的问题。

上面是说明如何读取文本,使得显示时不产生乱码。下面将介绍如何使之内容不产生跳跃。

为了内容能够平滑的显示出来,我们需要将当前显示的一部分内容和新读取的内容进行连接。假设我们显示的内容存储在buf_show【】中,新读取的内容在buf_read【】中,因此我们可以将buf_show【】未显示完的内容与buf_read进行连接,然后存储到buf_show[]中。这样我们在用户阅读的时候就将buf_show[]中的内容给替换了。这个替换的时机如何把握。


这里是已经显示的内容

……
这里是显示中的内容
……


这里是未显示的容(一行)

这时应该是最合适的时机,因为最后一行可能未填充完整。所以当还剩一行的时候就重新读取文本进行连接。

翻页功能实现方法相差不大。


当往回翻页翻行时该怎么办呢,如果仍按向下的实现思想,是不好处理的。

我们可以建立一个重新阅读位置的索引。

typedef struct

    UM_U32 index;//读取文件的位置
    UM_S32 skip;//该内容中最后是否省略了半个字符,1表示省略,0表示没有
} SHOWINDEX;


我们总共需要的索引数 = 文件大小/FILESIZE +1,然后进行malloc。创建索引控件。

向下阅读时记录 读取文件的位置。那么往回是就知道该从什么位置开始读取,而且不会截断汉字。


PS:第一次做文本阅读的功能,可能存在很多不足的地方……