初衷:
因为程序间用文件做通讯,所以通常把配置的读取到文件里面去了,而到代码的某一个点才需要一个或者几个属性,所以在很多循环里面做了打开关闭文件操作,十分低效。
不足:
1、不能特化指针
2、文件池里面没有做释放,也就是运行长时间以后,会占用比较多的内存,如有需要可以自己扩展写释放程序。
意义:
1、实用性是有的,我加入程序以后,速度快了三秒,大家都知道读取文件其实是很快的,但是程序逻辑之多,设计的人没有做好,导致内嵌循环又嵌循环,一个未处理数据走一个流程要打开关闭300多次文件,十分慢。
2、模板接口也是第一次做,发现特例化可以做成接口形式,所以学到了不少东西,哈哈。
3、共享出来是学习用的,大家如果有什么文件类型需要加到库里面,请留言
git项目路径如下(可以打开网址下载):
https://coding.net/u/ooklasd/p/FileReader/git关于怎么使用请看这里《windows git的安装与使用》
找个文件夹 右键clone就可以下载到了
以下是效果图:
以下是代码结构
以下是使用方法:
std::string fileName = "test.txt";
auto txtfileSys = FS::FilePool<std::string>::getInstance();
auto& txtfileData = txtfileSys->read(fileName);
std::cout<<txtfileData<<std::endl;
fileName = "test.xml";
auto xmlfileSys = FS::FilePool<TinyXml::TiXmlDocument>::getInstance();
auto& xmlfileData = xmlfileSys->read(fileName);
if(!xmlfileData.Error())
std::cout<<"xml文件:"
<<xmlfileData.RootElement()->ValueStr()
<<std::endl;
std::cout<<"二进制文件:";
fileName = "test.txt";
auto binfiles = FS::FilePool<FS::Bin>::getInstance();
auto& binfileData = binfiles->read(fileName);
if(binfileData.data)
{
std::cout.write(binfileData.data,binfileData.lenght);
std::cout<<std::endl;
}
以下是特例化示例:
//所有需要读取的文件类型都要进行特化
//若特化版为指针则为非法
//默认支持以下文件
//1、string流(非二进制流)
//2、tingxml
//3、二进制流
template<typename T>
class FileInterFace
{
virtual ~FileInterFace(){};
public:
//判断是否能读取该文件
virtual bool CanRead() const = 0;
//判断是否需要重新读取
virtual bool IsReLoad()const = 0;
//读取文件
virtual void Load()= 0;
//获取数据
virtual const T& GetData() const= 0;
};
//===================================================
// 读取普通文件特化版
//===================================================
typedef FileInterFace<std::string> NormalFile;
template<>
class FileInterFace<std::string>
{
public:
FileInterFace(const std::string& filePath);
const std::string& GetData()const{return _data;};
bool IsReLoad()const;
void Load();
private:
long long _lastWriteTime;
std::string _filePath;
std::string _data;
int count;
};