C语言fseek函数如何处理中文

在看到fseek函数的时候,做了一个示例程序,运行情况非常好,但是当我用一个全部是中文的文本测试程序时,发现出现了问题,源代码:

# include <stdio.h>
# include <stdlib.h>
# define SLEN 100
int main ( void )
{
char file[SLEN];
char ch;
FILE *fp;
long count, last;
puts ( "输入文件名字:" );
gets ( file );
if ( (fp = fopen ( file, "rb" )) == NULL )
{
printf ( "打开文件失败!\n" );
exit ( 1 );
}
fseek ( fp, 0L, SEEK_END );
last = ftell ( fp );
for ( count = 1L; count <= last; ++count )
{
fseek ( fp, -count, SEEK_END );
ch = getc ( fp );
putchar ( ch );
}
putchar ( '\n' );
fclose ( fp );
return 0;
}

其实也明白一点,首先汉字占用两个字符,所以用char ch变量是不能处理汉字的,,自然使用getc获取文件输入也应该是不可行的,putchar的话也直接挂掉了~本来有想用fgets和fputs函数来实现,但是研究了半天,还是没有进展,想请教大神们,如果是中文文本,如何处理这个问题呢?
最新回答
无人懂我

2024-11-29 15:02:53

中文文件要用TCHAR之类的多字节方法处理。
你的方法是把中文看成2进制一个字符一个字符的数据文件来处理,也是可以的,fseek工作完全正常,
问题是输出字符的显示,你可以显示每个字节的值,但不能显示成肉眼可识别的汉字。
putchar ( ch ); 可用于 ASCII字符。
你可以换成: printf("%02x ", 0xff & ch ); 可以显示单个字节的码值。从输出的码值可以看出,程序没有问题,只是不能显示成肉眼可识别的汉字。
另外,如果是unicode中文文件,则文件头有不可见的文件类型区分码0xfe 0xff 或 0xff 0xfe 等等。
2个单个字节码,合成一个双字节码,有大端和小端文件问题,也许需要互相交换相邻2个字节,再显示成中文。
菊花碎大石

2024-11-29 15:15:43

你好,我刚好学到这个地方
我发现文字的十六进制数会比数字和符号的十六进制数要大(文字>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;
和旋帅哥

2024-11-29 09:40:31

为什么非得从后面往前读呢?不过话说回来,就算如此,你要能够显示中文的话弄个数组,用fgets读取就是了啊,不知道你有什么问题
墨尘花舞影

2024-11-29 12:49:16

这个程序是想干什么的??