这么恼火的处理中文文件的问题!!!及时揭帖!

lyr311 2003-08-22 01:36:52
问题:大家帮我分析分析啊???
我在用文件处理中文的问题时遇到了让人疑惑的问题,磁盘上建立了一个中文文件cnforr.txt,现在我要把其中的中文字符读入到指针数组中(因为中文字符是
占了2个字节长度),中文源文件如下,目标文件取名"cnW.txt":
世界你好!
我作如下的程序处理此中文文件(采用fread-fwrite函数):
#include <stdio.h>
main()
{
FILE *fpr,*fpw;
int i,j;
char *cn[100];
fpr=fopen("cnforr.txt","r");
for(i=0;i<5;i++)
fread(&cn[i],2,1,fpr); /*既然说数组名代表了数组首地址,为什么读取文件的时候此处非要用取地址符号&呢,否则得到的答案不对呢?而当
数组不是指针数组而是普通的数组时就不能加&符号呢?严重疑惑??? */
fclose(fpr);
fpw=fopen("cnW.txt","w");
for(j=0;j<5;j++)
/* fprintf(fpw,"%s",cn[j]); */ /* 用这一句为什么不行呢?难道fread读出的数据非要用fwrite函数写入文件才能正确显示吗?否则显示的东西不知
道为何物啊?*/
fwrite(&cn[j],2,1,fpw);
fclose(fpw);
}
==========================
我把源文件“cnforr.txt”改为:
世,界,你,好,!
想用fscanf-fprintf函数试一试:
#include <stdio.h>
main()
{
FILE *fpr,*fpw;
int i=0,j;
char *cn[100];
char str[2];
fpr=fopen("cnforr.txt","r");
cn[0]=str; /*使数组指针有所指 ,这一句加不加都出错*/
/* for(i=0;i<4;i++) */ /*
{fscanf(fpr,"%s,%s,%s,%s,%s",cn[0],cn[1],cn[2],c[3],c[4]);} /*此时中文字符之间用逗号作了分隔,以便函数能识别字符串的界线.*/
fpw=fopen("cnW.txt","w+");
for(j=0;j<5;j++)
fprintf(fpw,"%s\n",cn[j]);
fclose(fpr);
fclose(fpw);
}
答案千奇百怪啊!!!
=========================
采用fputs-fgets函数也解决不了问题:
#include <stdio.h>
#include <stdlib.h>
main()
{
FILE *fpr,*fpw;
int i,j;
char *cn[100],str[3];
fpr=fopen("cnforr.txt","r");
cn[0]=str; /* 这是让指针数组事先有所指*/
for(i=0;i<5;i++)
fgets(cn[i],3,fpr);
fclose(fpr);
fpw=fopen("cnW.txt","w+");
for(j=0;j<5;j++)
fputs(cn[j],fpw); /* 用这个语句的话,有时候能出正确答案,有时候又不能出正确答案,甚至有时候跳出系统,实在搞不懂 */
/* fprintf(fpw,"%s",cn[j]);*/ /* 用这个语句,能出正确答案的次数很少,大多数情况是千奇百怪的答案啊,实在搞不懂 */
free(fpr);free(fpw);
fclose(fpw);
}
...全文
406 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyr311 2003-08-24
  • 打赏
  • 举报
回复
谢谢各位,结帐!!!
grail0922 2003-08-23
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <process.h>

void main()
{
FILE *fpr,*fpw;
int i=0,j=0;
char *cn[100];
fpr=fopen("cnforr.txt","r");
//for(i=0;i<5;i++)
while( !feof(fpr) )
{
//cn=new(sizeof(char));
fread(&cn[i],2,1,fpr);
i++;
}
/*你定义的是char* cn[100],这是一个指针数值,cn[i]只是一个无效指针,并没有指向任何有效内存,只是分配4个字节的指针空间给他,所以fread(cn[i],2,1,fpr)是没有意义的,而fread(&cn[i],2,1,fpr),是讲读入的汉字存放到指针的空间中,并不是指针cn[i]所指向的空间中,应为cn[i]并不指向任何空间 */
fclose(fpr);
fpw=fopen("cnW.txt","w+");
//for(j=0;j<5;j++)
//{
while( !feof(fpw) )
{// fprintf(fpw,"%s",cn); /*现在cn[j]不是一个指针啦,当然不能这样用,其实,程序不用真样写的,干吗要申明一个char* cn[100],申明为char cn[100]不好吗?*/
fwrite(&cn[j],2,1,fpw);
j++;
}
fclose(fpw);
system( "type cnW.txt" );
}
yellowdawnhlm 2003-08-23
  • 打赏
  • 举报
回复

----------------------------------------------------------------
原贴内容:
#include <stdio.h>
void main()
{
FILE *fpr,*fpw;
int i,j;
char *cn[100];
fpr=fopen("cnforr.txt","r");
for(i=0;i<5;i++)
fread(&cn[i],2,1,fpr); /*你定义的是char* cn[100],这是一个指针数值,cn[i]只是一个无效指针,并没有指向任何有效内存,只是分配4个字节的指针空间给他,所以fread(cn[i],2,1,fpr)是没有意义的,而fread(&cn[i],2,1,fpr),是讲读入的汉字存放到指针的空间中,并不是指针cn[i]所指向的空间中,应为cn[i]并不指向任何空间 */
fclose(fpr);
fpw=fopen("cnW.txt","w+");
for(j=0;j<5;j++)
/* fprintf(fpw,"%s",cn[j]); */ /*现在cn[j]不是一个指针啦,当然不能这样用,其实,程序不用真样写的,干吗要申明一个char* cn[100],申明为char cn[100]不好吗?*/
fwrite(&cn[j],2,1,fpw);
fclose(fpw);
}
ironic 2003-08-23
  • 打赏
  • 举报
回复
其实,这样来处理中文吃力不讨好,
为什么不像 Bandry(菜鸟-舍我其谁)说的那样,
用wchar、wchar_t呢?(c99 & dev-cpp中可用,c++中也可用)
ironic 2003-08-23
  • 打赏
  • 举报
回复
to:回复人: lyr311(老刘)
还有,这个地方:
cn[i][2]='\0';//让这个字符串结束,在内存中的情况为:
| //cn[0]-> "世\0"
| //cn[1]-> "界\0"
| //cn[2]-> "你\0" ...
|
|
[_____________________这个2是不是该是3?//第三个元素。。。
lyr311 2003-08-23
  • 打赏
  • 举报
回复
还有,这个地方:
cn[i][2]='\0';//让这个字符串结束,在内存中的情况为:
| //cn[0]-> "世\0"
| //cn[1]-> "界\0"
| //cn[2]-> "你\0" ...
|
|
[_____________________这个2是不是该是3?
lyr311 2003-08-23
  • 打赏
  • 举报
回复
to ironic(不知) :
兄台,你的答案目前我决得很有道理,我得上机试一试,不过,你的程序里面有一句:
=================================================================================
int cn[100];// 或char cn[100][2];,cn[i]至少要能放下一个中文字符
=================================================================================
我还是不理解int cn[100];的定义方式,既然定义的是一维数组,怎么能在每个元素中存取2字符呢,你的想法是不是把字符全部存在一维数组中啊?也就是:
cn[]="世界你好!"的这种方式啊,这样一来,好像就没法单独取出一个汉字了吧,比如,对汉字进行字典排序,能作到吗?而定义成二位数组的的形式则可以单独取出每一个汉字cn[i][2]来实现啊?望赐教!!!不胜感激!!!
ironic 2003-08-23
  • 打赏
  • 举报
回复

//写一个虽然是错误的用法,但仍可以运行的程序:
#include <stdio.h>
int main(void)
{
FILE *fpr,*fpw;
int i;
char * cn[100];

fpr=fopen("cnforr.txt","r");
if(!fpr)
{
printf(" error in open file\n");
exit(1);
}

fpw=fopen("cnW.txt","w");
if(!fpw)
{
printf(" error in open file\n");
exit(1);
}


for(i=0;i<5;i++)
fread(&cn[i] ,2,1,fpr); //虽然没有为cn[i]分配空间,但,&cn[i]指向的内存已
//可以“装”得下一个中文字符所以,不会出错
//所以,上边的定义char *cn[100]可以改为
//int * 或float *或double *
//但无论如何,这种用法不可取
fclose(fpr);

for(i = 0;i < 5;i++)
{
fwrite(&cn[i],2,1,fpw);
fwrite(&cn[i],2,1,stdout);
}
fclose(fpw);
return 0;
}
ironic 2003-08-23
  • 打赏
  • 举报
回复
按你的想法写了一个:
#include <stdio.h>
int main(void)
{
FILE *fpr,*fpw;
int i;
char *cn[100];

fpr=fopen("cnforr.txt","r");
if(!fpr)
{
printf(" error in open file\n");
exit(1);
}

fpw=fopen("cnW.txt","w");
if(!fpw)
{
printf(" error in open file\n");
exit(1);
}

for(i = 0 ;i<100; i++)
{
// cn[i] 是一个指针数组,要使它指向可用的内存,才可合法使用
cn[i] = (char * ) malloc( 2 *sizeof(char));
if( !cn[i] ) //
{
printf(" I'm sorry ,but,there is not enough memory,exiting...\n");
}
}

for(i=0;i<5;i++)
fread(cn[i],2,1,fpr); //cn[i]本身就指向了一个可用内存区,不用再加&
fclose(fpr);

for(i=0;i<5;i++)
{
fwrite(cn[i],2,1,fpw);
fwrite(cn[i],2,1,stdout); //显示一下看看
}
/***************************************************
想用fprintf(fpw,"%s",cn[j]); 的话,上边的代码应改为:
for(i = 0 ;i<100; i++)
{
cn[i] = (char * ) malloc( 3 *sizeof(char)); //为后边加'\0'
if( !cn[i] ) //
{
printf(" I'm sorry ,but,there is not enough memory,exiting...\n");
}
}

for(i=0;i<100;i++)
{
fread(cn[i],2,1,fpr);
cn[i][2]='\0';//让这个字符串结束,在内存中的情况为:
//cn[0]-> "世\0"
//cn[1]-> "界\0"
//cn[2]-> "你\0" ...
}
fclose(fpr);

for(i=0;i<100;i++)
{
fprintf(fpw,"%s",cn[i]);
fprintf(stdout,"%s",cn[i]);

}
**************************************************/

fclose(fpw);
return 0;
}
多看一下指针,指针数组,数组这几个的区别
lyr311 2003-08-23
  • 打赏
  • 举报
回复
楼上的老兄,我还是不明白啊:
#include <stdio.h>
void main()
{
FILE *fpr,*fpw;
int i,j;
char *cn[100];
fpr=fopen("cnforr.txt","r");
for(i=0;i<5;i++)
fread(&cn[i],2,1,fpr); /*你是用指针的空间来存放读入的字母
一个指针是4个字节,读入一个汉字2个字节,放在一个指针空间,
下一个汉字放在下一个指针空间中*/ /*数组名本身不是已经代表了它的首地址吗?也就是数组名本身就相当于指针拉,我只有这一次才见过数组名这种用法啊,如果是数值数组,这样用就会出错哦??? */
fclose(fpr);
fpw=fopen("cnW.txt","w+");
for(j=0;j<5;j++)
/* fprintf(fpw,"%s",cn[j]); */ /* 这我就不用我讲啦把,讲一下三,我就是不懂才问的嘛!谢啦!愿听高见!*/
fwrite(&cn[j],2,1,fpw);
fclose(fpw);
}
ironic 2003-08-23
  • 打赏
  • 举报
回复
#include <stdio.h>
main()
{
FILE *fpr,*fpw;
int i,j;
char *cn[100]; //定义一个有100个元素的指针数组,这些指针没有初始化是不能用的哦

fpr=fopen("cnforr.txt","r");//要是打不开文件怎么办?

for(i=0;i<5;i++)
fread(&cn[i],2,1,fpr);//这里要不加&反而就不会出错(但这样一来,观念就是错了的,呵呵)

fclose(fpr);
fpw=fopen("cnW.txt","w");
for(j=0;j<5;j++)
/* fprintf(fpw,"%s",cn[j]);//fprintf(%s) 遇到'\0'才会停止,你的上边的数组有'\0'么
fwrite(&cn[j],2,1,fpw);//看来你还是分不清数组的用途
fclose(fpw);
}
==========================
我把源文件“cnforr.txt”改为:
世,界,你,好,!
想用fscanf-fprintf函数试一试:
#include <stdio.h>
main()
{
FILE *fpr,*fpw;
int i=0,j;
char *cn[100];
char str[2];
fpr=fopen("cnforr.txt","r");
cn[0]=str; /*使数组指针有所指 ,这一句加不加都出错*/ //这一句至少可以保证你第一次不会出错,记住,要给指针指向一个已分配的空间

{fscanf(fpr,"%s,%s,%s,%s,%s",cn[0],cn[1],cn[2],c[3],c[4]);} /*此时中文字符之间用逗号作了分隔,以便函数能识别字符串的界线.*/ //问题并不在你说的这样,c[i]完全可以容下一个中文字符,因为c[i]可以装下一个指针(当然也就能装下一个中文字符)
fpw=fopen("cnW.txt","w+");
for(j=0;j<5;j++)
fprintf(fpw,"%s\n",cn[j]);
fclose(fpr);
fclose(fpw);
}
答案千奇百怪啊!!!
=========================
采用fputs-fgets函数也解决不了问题:
#include <stdio.h>
#include <stdlib.h>
main()
{
FILE *fpr,*fpw;
int i,j;
char *cn[100],str[3];
fpr=fopen("cnforr.txt","r");
cn[0]=str; /* 这是让指针数组事先有所指*/
for(i=0;i<5;i++)
fgets(cn[i],3,fpr);//第二次循环要出错
fclose(fpr);
fpw=fopen("cnW.txt","w+");
for(j=0;j<5;j++) fprintf(fpw,"%s",cn[j]);
free(fpr);free(fpw);
fclose(fpw);
}

写一个:

#include <stdio.h>
int main()
{
FILE *fpr,*fpw;
int i,j;
int cn[100];// 或char cn[100][2];,cn[i]至少要能放下一个中文字符

fpr=fopen("cnforr.txt","r");
if(!fpr)
{
printf(" error in open file\n");
exit(1);
}
fpw=fopen("cnW.txt","w");
if(!fpw)
{
printf(" error in open file\n");
exit(1);
}


for(i=0;i<5;i++)
{ fread(&cn[i],2,1,fpr); }

fclose(fpr);

for(j=0;j<5;j++)
{ fwrite(&cn[j],2,1,fpw); }
fclose(fpw);
}
lyr311 2003-08-23
  • 打赏
  • 举报
回复
TO :njtu(天地不容)
#include <stdio.h>
main()
{
FILE *fpr,*fpw;
int i,j;
char *cn[100];
fpr=fopen("cnforr.txt","r");
for(i=0;i<5;i++)
//cn 等价与&cn[1],在这里不一样啊,你可以测试一下,搞不懂
//数组是一样的,都可以这样使用
fread(&cn[i],2,1,fpr);
fclose(fpr);
fpw=fopen("cnW.txt","w");
for(j=0;j<5;j++)
//这里应该不匹配 cn[j] 的类型是char *
fwrite(&cn[j],2,1,fpw);
fclose(fpw);
}
njtu 2003-08-23
  • 打赏
  • 举报
回复
//这里应该不匹配 cn[j] 的类型是char *
/* fprintf(fpw,"%s",cn[j]); */
njtu 2003-08-23
  • 打赏
  • 举报
回复
//楼主还是要看看指针与数组的关系吧
//另外处理汉字是要做点准备工作的,看看相关的介绍

#include <stdio.h>
main()
{
FILE *fpr,*fpw;
int i,j;
char *cn[100];
fpr=fopen("cnforr.txt","r");
for(i=0;i<5;i++)
//cn 等价与&cn[1]
//数组是一样的,都可以这样使用
fread(&cn[i],2,1,fpr);
fclose(fpr);
fpw=fopen("cnW.txt","w");
for(j=0;j<5;j++)
//这里应该不匹配 cn[j] 的类型是char *
fwrite(&cn[j],2,1,fpw);
fclose(fpw);
lyr311 2003-08-23
  • 打赏
  • 举报
回复
问题多多啊!各位兄台看一看啊????
lyr311 2003-08-23
  • 打赏
  • 举报
回复
To grail0922(grail):问题多多!!!!!
对于第一个问题的解释,我还是不解,你看这段程序,这是TC2.0实用大全上的一个例子:
程序1.
# include <stdio.h>
# include <stdlib.h>
main(void)
{
FIlE *fp;
float sample[100];
int i;
if((fp=open("sample","wb"))==NULL)
{ printf(”cannot open file\n");
exit(1);
}
for(i=0;i<100;i++)sample[i]=(float)i;
if(fwrite(sample,sizeof(sample),1,fp)! =1) /*看它这个地方就可以直接用数组名*/
printf("File Error");
fclose(fp);
return 0;
}
程序2.
# include <stdio.h>
# include <stdlib.h>
main(void)
{
FIlE *fp;
float sample[100];
int i;
if((fp=open("sample","rb"))==NULL)
{ printf(”cannot open file\n");
exit(1);
}
if(fread(sample,sizeof(sample),1,fp)! =1) /*看它这个地方就可以直接用数组名*/
printf("File Error");
for(i=0;i<100;i++)printf("%f",sample[i]);
fclose(fp);
return 0;
}

======================================={// fprintf(fpw,"%s",cn); /*现在cn[j]不是一个指针啦,当然不能这样用,其实,程序不用真样写的,干吗要申明一个char* cn[100],申明为char cn[100]不好吗?*/
========================================
此时cn[j]不是指针,为什么?他是数组名啊?数组名不就是指向数组的首地址吗?申明为char cn[100]?不行吧,我是想把汉字读取出来存入数组中哦,比如说,我要对读取出来的汉字进行字典排序,那你怎么办,一位数组不好解决吧?
lyr311 2003-08-23
  • 打赏
  • 举报
回复
好像有点明白了,我再看一看哈!
yellowdawnhlm 2003-08-22
  • 打赏
  • 举报
回复
#include <stdio.h>
void main()
{
FILE *fpr,*fpw;
int i,j;
char *cn[100];
fpr=fopen("cnforr.txt","r");
for(i=0;i<5;i++)
fread(&cn[i],2,1,fpr); /*你是用指针的空间来存放读入的字母
一个指针是4个字节,读入一个汉字2个字节,放在一个指针空间,
下一个汉字放在下一个指针空间中*/
fclose(fpr);
fpw=fopen("cnW.txt","w+");
for(j=0;j<5;j++)
/* fprintf(fpw,"%s",cn[j]); */ /* 这我就不用我讲啦把*/
fwrite(&cn[j],2,1,fpw);
fclose(fpw);
}
lyr311 2003-08-22
  • 打赏
  • 举报
回复
上面的老兄,TC中有没有解决我的问题的方法啊?谢谢啦!
yellowdawnhlm 2003-08-22
  • 打赏
  • 举报
回复
windows sdk 中才有
加载更多回复(2)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧