C语言fseek函数如何处理中文
发布网友
发布时间:2022-05-18 21:29
我来回答
共4个回答
热心网友
时间:2023-11-06 02:10
中文文件要用TCHAR之类的多字节方法处理。
你的方法是把中文看成2进制一个字符一个字符的数据文件来处理,也是可以的,fseek工作完全正常,
问题是输出字符的显示,你可以显示每个字节的值,但不能显示成肉眼可识别的汉字。
putchar ( ch ); 可用于 ASCII字符。
你可以换成: printf("%02x ", 0xff & ch ); 可以显示单个字节的码值。从输出的码值可以看出,程序没有问题,只是不能显示成肉眼可识别的汉字。
另外,如果是unicode中文文件,则文件头有不可见的文件类型区分码0xfe 0xff 或 0xff 0xfe 等等。
2个单个字节码,合成一个双字节码,有大端和小端文件问题,也许需要互相交换相邻2个字节,再显示成中文。
热心网友
时间:2023-11-06 02:11
你好,我刚好学到这个地方
我发现文字的十六进制数会比数字和符号的十六进制数要大(文字>0x7f)
可以根据这个进行判断,若ch>0x7f则用fseek再往前进1,然后顺序输出两个ch(一个ch占两字节,顺序输出两个ch就是4个字节=一个文字)
下边是我的代码:你可以参考一下
#include"stdio.h"
#define CNTL_Z '0\32'
int main()
{
FILE *ptf_r;
FILE *ptf_w;
char name[40];
char name2[40];
char ch;
char ch2;
int i;
long sum;
puts("please enter the file to process");
gets(name);
if((ptf_r=fopen(name,"rb"))==NULL)
puts("the file have nothing to process");
fseek(ptf_r,0L,SEEK_END);
sum=ftell(ptf_r);
for(i=1;i<=sum;i++)//输出数字字母
{
fseek(ptf_r,-i,SEEK_END);
ch=fgetc(ptf_r);
if(ch!=CNTL_Z&&ch!='\r')//定位到最后一个字符
if((0xff & ch)>0x7f)//判断是否为文字(文字由两个char大小构成,无论是前一个或者后一个的十六进制大小都大于字母、数字和符号)
{fseek(ptf_r,-2L,SEEK_CUR);//是,继续向前进1个字符
ch2=fgetc(ptf_r);
putchar(ch2);//先打印前一个字符
putchar(ch);//往后走打印第二个字符
++i;}//(文字占两个字符所以i要再加1)
else putchar(ch);}
putchar('\n');
fclose(ptf_r);
getchar();
return 0;
热心网友
时间:2023-11-06 02:11
为什么非得从后面往前读呢?不过话说回来,就算如此,你要能够显示中文的话弄个数组,用fgets读取就是了啊,不知道你有什么问题
热心网友
时间:2023-11-06 02:12
这个程序是想干什么的??