首先声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。
在上一篇文章中,我们利用字符型变量处理了文本文件中的英文字符。但是,文本文件中不仅能输入英文字符,更多的时候我们需要处理汉字,如何用C语言程序读写这些汉字呢?大多数的C语言初学者或者已经学过C语言的学生对这个问题并不清楚,主要是因为教材上很少涉及这个问题。实际上汉字的读写是很实用的操作,它是基于汉语的文本搜索、自然语言处理等应用的基础。本文中将利用字符处理函数读写汉字,因此,也把这个问题当作是字符型数据的扩展应用。
文本文件中的英文字符是按照ASCII码存储的,每一个字符占一个字节,而汉字是按照汉字内码存储的,每一个汉字占两个字节(注意:汉字有不同编码:外码,国标码,内码,字形码等,请查阅相关资料)。汉字内码是在国标码的基础上加了8080H,换句话说,将国标码的两个字节的最高位置1,则变成了汉字内码。下面的例子可以显示文本文档中一个汉字的内码。
例1:在一个名为“a.txt”的文本文档中输入一个汉字“啊”,以十六进制的形式输出其内码。
#include"stdio.h"
int main()
{
char c;
freopen("a.txt","r",stdin);
//读出两个字节并输出
c = getchar();
printf("%X", c);
c = getchar();
printf("%X", c);
return 0;
}
图1显示了文本文件“a.txt”的内容,图2显示了汉字“啊”的内码。
图1. 文本文件a.txt的内容
图2. 汉字“啊”的内码
输出结果较长,是因为每个字节按照整型实际输出了4个字节,因为内码的最高位为1,因此最高三个字节的输出都是FF,我们只取第四个字节。因此“啊“的内码是B0A1。当然如果想输出更多汉字的内码,只需在文本文件中输入更多汉字,程序中加入循环处理即可。
反过来,如果知道了一个汉字的内码,能不能往文本文件中写入该汉字?答案是肯定的。下面的例子就是实现这一任务的。
例2:向文本文件“m.txt”中写入汉字“秦”,已知“秦”的内码是C7D8。
#include "stdio.h"
int main()
{
freopen("m.txt","a",stdout); //模式"a"不删除文件中已存在的内容,在后面添加。
//连续向文件中写入内码的高字节和低字节。
putchar(0xC7);
putchar(0xD8);
return 0;
}
运行程序后查看文件“m.txt”,如图3所示,“秦”字已经添加在其中。
图3. 程序运行后m.txt中的内容
上面的两个例子演示了如何用C语言的字符处理函数读写文本文件中的汉字,当然还可以对这两个例子进行扩展,比如在文本文件中进行汉字的查找和替换等。