- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C C一次将整个文件读入内存
C、 C++一次将整个文件读入内存1.问题描述:
?? ? ? ?C和C++的初学者经常采用一行一行读入文件的办法对文件数据进行处理。但是经常会有一些情况需要将一个文件整体一次读入内存处理。而C和C++库中并没有提供直接一次读入文件全部数据的函数。
@2.解决方法:
?? ? ? ?目前给出C和C++的解决方案,下面两个程序只是用于演示,不过这些代码已经很容易改写成想要的函数了。
?? ? ? ?解决这个问题的思路是:
?? ? ? ?1.由于要将文件完整读入,所以必须使用二进制方式打开(若文本方式打开,文件流中会把一些非字符的数据过滤掉,我们将读取不到那些内容)。
?? ? ? ?2.打开文件后,我们首先获取文件的大小,然后在内存中分配足够的空间,再把文件拷贝到内存空间中。之后使用内存空间进行数据处理,演示程序中没有真正的处理,我们只是简单将其输出。
@3.代码:
C实现
[cpp]?view plaincopy
#include?stdio.h??
#include?stdlib.h??
??
int?main?()??
{??
????FILE?*?pFile;??
????long?lSize;??
????char?*?buffer;??
????size_t?result;??
??????
????/*?若要一个byte不漏地读入整个文件,只能采用二进制方式打开?*/???
????pFile?=?fopen?(test.txt,?rb?);??
????if?(pFile==NULL)??
????{??
????????fputs?(File?error,stderr);??
????????exit?(1);??
????}??
??
????/*?获取文件大小?*/??
????fseek?(pFile?,?0?,?SEEK_END);??
????lSize?=?ftell?(pFile);??
????rewind?(pFile);??
??
????/*?分配内存存储整个文件?*/???
????buffer?=?(char*)?malloc?(sizeof(char)*lSize);??
????if?(buffer?==?NULL)??
????{??
????????fputs?(Memory?error,stderr);???
????????exit?(2);??
????}??
??
????/*?将文件拷贝到buffer中?*/??
????result?=?fread?(buffer,1,lSize,pFile);??
????if?(result?!=?lSize)??
????{??
????????fputs?(Reading?error,stderr);??
????????exit?(3);??
????}??
????/*?现在整个文件已经在buffer中,可由标准输出打印内容?*/??
????printf(%s,?buffer);???
??
????/*?结束演示,关闭文件并释放内存?*/??
????fclose?(pFile);??
????free?(buffer);??
????return?0;??
}??
C++实现
[cpp]?view plaincopy
#include?iostream??
#include?fstream??
using?namespace?std;??
??
int?main?()?{??
??filebuf?*pbuf;??
??ifstream?filestr;??
??long?size;??
??char?*?buffer;??
??//?要读入整个文件,必须采用二进制打开???
??filestr.open?(test.txt,?ios::binary);??
??//?获取filestr对应buffer对象的指针???
??pbuf=filestr.rdbuf();??
????
??//?调用buffer对象方法获取文件大小??
??size=pbuf-pubseekoff?(0,ios::end,ios::in);??
??pbuf-pubseekpos?(0,ios::in);??
?????
??//?分配内存空间??
??buffer=new?char[size];??
?????
??//?获取文件内容??
??pbuf-sgetn?(buffer,size);??
????
??filestr.close();??
??//?输出到标准输出??
??cout.write?(buffer,size);??
????
??delete?[]buffer;??
??return?0;??
}??
@4
文档评论(0)