我在一个名为temp.txt的文本文件中写入一些英文字符:abcdefghijklmnopq,然后我将其保存为ansi编码的文本.
然后我在c中用fread()函数将该文本中的内容读到char *buf[]当中,
FILE* fp = fopen("temp.txt","r+");
int flen = ftell(fp); //求得文本的大小
char* buf=(char *)malloc(flen+1);
fread(buf,flen+1,1,fp); //从文件中读入内容到buf中
printf("%s",buf)打印输出该buf中的内容
但是显示的结果却是一堆汉字乱码
为什么是一堆乱码,怎样才能输出文本中的英文字符
第1个回答 2008-04-27
详细的代码我在这就不给出了,这个现象好多人都会碰到的,特别是在动态分配内存时更是时常碰到.
其原因是:动态申请的内存它不会初始化为"\0",而printf()函数它输出字符串时,是要碰到"\0"才结束的,如果没有这个结束符,就会输出一串乱码.在你程序中的memset(buf,0,flen+1); //初始化buf为'\0' 这个语句.memset(buf,0,flen+1); 中的"0"并不是"\0".你可以用另外种方式将其初始化,如:for(i=0;i<flen;i++)*(buff+i)='\0';这样后再将文件内容读到缓冲区buff中.
fread(buf,flen+1,1,fp); //从文件中读入内容到buf中 这句中没有必要用"flen+1"的.
其原因是:动态申请的内存它不会初始化为"\0",而printf()函数它输出字符串时,是要碰到"\0"才结束的,如果没有这个结束符,就会输出一串乱码.在你程序中的memset(buf,0,flen+1); //初始化buf为'\0' 这个语句.memset(buf,0,flen+1); 中的"0"并不是"\0".你可以用另外种方式将其初始化,如:for(i=0;i<flen;i++)*(buff+i)='\0';这样后再将文件内容读到缓冲区buff中.
fread(buf,flen+1,1,fp); //从文件中读入内容到buf中 这句中没有必要用"flen+1"的.
第2个回答 2008-04-27
我给出一个可以读出你的文本的代码,而你的代码读不出的原因分析在后面.
//我的程序,vc6.0编译通过
#include<stdio.h>
char buff[512];
void readfile()
{
FILE *fp;
char *p;
if((fp=fopen("c:\\temp.txt","r"))==NULL) return 1;//路径设置要正确,要不读不出来.
//这里我默认你的文件是这个:c:\temp.txt.
while(1){
if(fgets(buff,512,fp)!=NULL) break;
}
}
main()
{
readfile();
printf("%s\n",buff);
}
//你的几点错误:
char *buf[]//这样的定义是二级的指针,相当于二维数组.
int flen = ftell(fp); //求得文本的大小
/*
这句是错的,我没记错的话,ftell返回的是文件的尾,要知道文件大小,要用下面一句:
fp=fopen……
int flen=ftell(fp)-fp;
*/
fread(buf,flen+1,1,fp); //从文件中读入内容到buf中
//这一句要在
char *buf;
buf=malloc……
这种前提下才会正确
//我的程序,vc6.0编译通过
#include<stdio.h>
char buff[512];
void readfile()
{
FILE *fp;
char *p;
if((fp=fopen("c:\\temp.txt","r"))==NULL) return 1;//路径设置要正确,要不读不出来.
//这里我默认你的文件是这个:c:\temp.txt.
while(1){
if(fgets(buff,512,fp)!=NULL) break;
}
}
main()
{
readfile();
printf("%s\n",buff);
}
//你的几点错误:
char *buf[]//这样的定义是二级的指针,相当于二维数组.
int flen = ftell(fp); //求得文本的大小
/*
这句是错的,我没记错的话,ftell返回的是文件的尾,要知道文件大小,要用下面一句:
fp=fopen……
int flen=ftell(fp)-fp;
*/
fread(buf,flen+1,1,fp); //从文件中读入内容到buf中
//这一句要在
char *buf;
buf=malloc……
这种前提下才会正确
第3个回答 2008-04-27
函数名: fread
功 能: 从一个流中读数据
用 法: int fread(void *ptr, int size, int nitems, FILE *stream);
参 数:用于接收数据的地址(字符型指针)(ptr)
单个元素的大小(size)
元素个数(nitems)
提供数据的文件指针(stream)
返回值:成功读取的元素个数
fread(buf,1,flen+1,fp);
再说,你得到文本大小的方法对吗? 刚打开文件,直接ftell得到的值不是0吗? 应该fseek的吧
功 能: 从一个流中读数据
用 法: int fread(void *ptr, int size, int nitems, FILE *stream);
参 数:用于接收数据的地址(字符型指针)(ptr)
单个元素的大小(size)
元素个数(nitems)
提供数据的文件指针(stream)
返回值:成功读取的元素个数
fread(buf,1,flen+1,fp);
再说,你得到文本大小的方法对吗? 刚打开文件,直接ftell得到的值不是0吗? 应该fseek的吧
第4个回答 2008-04-28
1楼正解,楼主你需要用一下fseek()的函数
#include<stdio.h>
#include <malloc.h>
#include <memory.h>
void main()
{
FILE * fp = fopen("temp.txt","r");
fseek(fp,0,2); //文件指针移到末尾
int flen = ftell(fp); //求得文本的大小
char* buf=(char *)malloc(flen+1);
memset(buf,0,flen+1); //初始化buf为'\0'
fseek(fp,0,0); //文件指针移回开始
fread(buf,flen,1,fp); //从文件中读入内容到buf中
printf("%s\n",buf); //打印输出该buf中的内容
fclose(fp);
}
#include<stdio.h>
#include <malloc.h>
#include <memory.h>
void main()
{
FILE * fp = fopen("temp.txt","r");
fseek(fp,0,2); //文件指针移到末尾
int flen = ftell(fp); //求得文本的大小
char* buf=(char *)malloc(flen+1);
memset(buf,0,flen+1); //初始化buf为'\0'
fseek(fp,0,0); //文件指针移回开始
fread(buf,flen,1,fp); //从文件中读入内容到buf中
printf("%s\n",buf); //打印输出该buf中的内容
fclose(fp);
}
第5个回答 2008-04-27
#include<stdio.h>
#include <malloc.h>
#include <memory.h>
void main()
{
FILE * fp = fopen("123.txt","r");
fseek(fp,0,2); //文件指针移到末尾
int flen = ftell(fp); //求得文本的大小
char* buf=(char *)malloc(flen+1);
memset(buf,0,flen+1); //初始化buf为'\0'
fseek(fp,0,0); //文件指针移回开始
fread(buf,flen,1,fp); //从文件中读入内容到buf中
printf("%s",buf); //打印输出该buf中的内容
fclose(fp);
}本回答被提问者采纳
#include <malloc.h>
#include <memory.h>
void main()
{
FILE * fp = fopen("123.txt","r");
fseek(fp,0,2); //文件指针移到末尾
int flen = ftell(fp); //求得文本的大小
char* buf=(char *)malloc(flen+1);
memset(buf,0,flen+1); //初始化buf为'\0'
fseek(fp,0,0); //文件指针移回开始
fread(buf,flen,1,fp); //从文件中读入内容到buf中
printf("%s",buf); //打印输出该buf中的内容
fclose(fp);
}本回答被提问者采纳