发布日期:2018-03-26
用来检查一个文件是否存的标准C++或者C++11或者C的最快的方式?+ 查看更多
用来检查一个文件是否存的标准C++或者C++11或者C的最快的方式?
+ 查看更多
发布日期:2018-02-26 10:15
分类:CPlusPlus
浏览次数:107
如下:我想要找一个最快的方式用来检查一个文件是否存在于标准C++或者C++11或者C中.我有几千个文件并且在操作他们之前,我需要检查他们是否都存在。在下面的函数中,我应该在/* SOMETHING */的位置写什么?
inline bool exist(const std::string& name) { /* SOMETHING */ }
回答:
好的,我罗列了一个会运行这些方法100000的测试程序,其中一半的文件存在,一半的文件不存在。
#include#include #include inline bool exists_test0 (const std::string& name) { ifstream f(name.c_str()); return f.good(); } inline bool exists_test1 (const std::string& name) { if (FILE *file = fopen(name.c_str(), "r")) { fclose(file); return true; } else { return false; } } inline bool exists_test2 (const std::string& name) { return ( access( name.c_str(), F_OK ) != -1 ); } inline bool exists_test3 (const std::string& name) { struct stat buffer; return (stat (name.c_str(), &buffer) == 0); }
运行100000次总时间的结果都需要5次运行结果取平均.
Method exists_test0 (ifstream): **0.485s** Method exists_test1 (FILE fopen): **0.302s** Method exists_test2 (posix access()): **0.202s** Method exists_test3 (posix stat()): **0.134s**
在我的系统中stat()函数提供最佳的性能(Linux,用g++编译),如果你因为某些原因拒绝使用POSIX函数,调用标准fopen函数是最好的办法.