利用fopen的fread和ifstream的read来读取txt文件的全部内容
2015-07-17 14:10
756 查看
读取一个文件的全部内容,有很多种方法,在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;//指针不再使用,一定要“删除”,防止产生野指针
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;//指针不再使用,一定要“删除”,防止产生野指针
相关文章推荐
- Daddy, I found it!, 15 Awesome Linux Find Command Examples (15个极好的Linux find命令示例 )
- hadoop之MapReduce调用R的一次失败的总结~(续一)
- Activity 重载方法 onStart和onResume、onPause和onStop的区别
- 最近有个需求,就是把某个网址跳转到另外一个网址
- 编译安装LNMP(在centos6.4系统下)
- Linux下黑色屏幕中蓝色字体颜色 修改方法
- CentOS7安装pidgin-lwqq
- linux 多线程那点事
- 尝试制作在A20上(CB2)自己的Linux系统
- CentOS 6.6配置安装(Apache+PHP5+MySQL)LAMP服务器
- Linux定时器
- openlayers 注册事件例子
- Linux中history用法15例
- ubuntu下的环境变量
- shell 常用命令
- 取消进程释放资源
- Centos 6 克隆导致网卡eth0变成eth1、及修改网卡名的方法
- vbs经典回顾之[键盘输入方法]wshShell.SendKeys
- Looper、Message、Handler
- 学习网页网站