利用fopen的fread和ifstream的read来读取txt文件的全部内容

 

读取一个文件的全部内容,有很多种方法,在QT下可以用QFile,非常方便;在VS下暂时知道的有两种,一种是fopen文件,一种是文件流操作ifstream。分别简单介绍一下实现:(打开方式都要加上二进制,否则中文会出错)

1.用fopen实现

char *charFilePath=“abc.txt";

FILE *pfile=fopen(charFilePath,"rb");//打开文件,返回文件操作符
char *pread;
size_t result;
if(pfile)//打开文件一定要判断是否成功
{
fseek(pfile,0,SEEK_END);//将文件内部的指针指向文件末尾
long lsize=ftell(pfile);//获取文件长度,(得到文件位置指针当前位置相对于文件首的偏移字节数)
rewind(pfile);//将文件内部的指针重新指向一个流的开头
pread=(char *) malloc(lsize*sizeof(char)+1);//申请内存空间,lsize*sizeof(char)是为了更严谨,16位上char占一个字符,其他机器上可能变化

//用malloc申请的内存是没有初始值的,如果不赋值会导致写入的时候找不到结束标志符而出现内存比实际申请值大,写入数据后面跟随乱码的情况
memset(pread,0,lsize*sizeof(char)+1);//将内存空间都赋值为‘\0’

result=fread(pread,1,lsize,pfile);//将pfile中内容读入pread指向内存中
}
QString qstr=QString::fromLocal8Bit(pread);//要进行转码,否则中文字符无法显示
fclose(pfill);//关掉文件操作符,和句柄一样,有open就一定有close
free(pread);//释放内存
pread=NULL;//指针不再使用,一定要“删除”,防止产生野指针

2.用ifstream实现:

char *charFilePath=“abc.txt";
char *preadd;
std::ifstream inFile(charFilePath,std::ifstream::binary);//打开文件,返回文件流操作符
if(inFile)
{
inFile.seekg(0,inFile.end);//指针指向文件尾部,0表示离end的偏移量,如果是1就是指向倒数第一个
int length=inFile.tellg();//返回文件的长度
inFile.seekg(0,inFile.beg);//指针指向文件首地址

preadd=(char *) new char[length+1];  //new在c++中使用会直接给分配的内存赋值,但char *属于C类型,所以也需要memset

memset(preadd,0,length+1);
/*int len=strlen(preadd);自己用来查看申请内存后preadd的内存大小,加了memset将内存全部给'\0',得到的len=0;如果没有memset会是一个比length+1的数*/
inFile.read (preadd,length);//读取文件,存入缓存器
}

QString qqstr=QString::fromLocal8Bit(preadd);//要进行转码,否则中文字符无法显示
inFile.close();//关掉文件操作符,和句柄一样,有open就一定有close
delete [] preadd;//释放内存,new对应的是delete,中间的[]不能省略
pread=NULL;//指针不再使用,一定要“删除”,防止产生野指针

posted on 2015-07-17 14:10  粪斗的渣渣  阅读(15302)  评论(0编辑  收藏  举报