C++通過(guò)文件指針獲取文件大小的方法實(shí)現(xiàn)
1. 敘述
對(duì)于讀取本地文件,很多時(shí)候需要預(yù)先知道本地文件的大小在進(jìn)行讀取。網(wǎng)上給出的方案是移動(dòng)文件指針,計(jì)算文件頭和文件尾的偏移,計(jì)算出文件的大小。但是我總覺(jué)得這樣做可能會(huì)與讀取文件一樣消耗性能,為了解決這個(gè)問(wèn)題,我寫了如下例子驗(yàn)證了一下。
#include <iostream>
#include <fstream>
#include<Windows.h>
using namespace std;
class CTimer
{
public:
CTimer(void);
~CTimer(void);
int time_in();
double time_out();
private:
LARGE_INTEGER litmp;
LONGLONG qt1, qt2;
double dft, dff, dfm;
};
CTimer::CTimer(void)
{
}
CTimer::~CTimer(void)
{
}
int CTimer::time_in()
{
QueryPerformanceFrequency(&litmp);//獲得時(shí)鐘頻率
dff = (double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);//獲得初始值
qt1 = litmp.QuadPart;
return 1;
}
double CTimer::time_out()
{
QueryPerformanceCounter(&litmp);//獲得終止值
qt2 = litmp.QuadPart;
dfm = (double)(qt2 - qt1);
dft = dfm / dff;//獲得對(duì)應(yīng)的時(shí)間值
return dft;
}
int main()
{
string file_name = "D:/Work/test.zip";
CTimer timer;
ifstream ifs(file_name, std::ios::binary | std::ios::in);
if (!ifs.is_open())
{
return 0;
}
timer.time_in();
ifs.seekg(0, std::ios::end);
int len = ifs.tellg();
ifs.seekg(0, std::ios::beg);
cout << "獲取文件長(zhǎng)度耗時(shí):" << timer.time_out() << "秒" << endl;
timer.time_in();
char *buff = new char[len];
ifs.read(buff, len);
delete[]buff;
timer.time_out();
cout << "讀取文件耗時(shí):" << timer.time_out() << "秒" << endl;
return 1;
}
如上所示,我寫了一個(gè)計(jì)時(shí)器,分別統(tǒng)計(jì)偏移文件指針計(jì)算文件長(zhǎng)度與讀取整個(gè)文件的耗時(shí),運(yùn)行結(jié)果如下:

2. 結(jié)論
可以看到,偏移文件指針帶來(lái)的時(shí)間消耗非常小,幾乎可以忽略不記。通過(guò)這個(gè)方法,不僅可以很快計(jì)算文件長(zhǎng)度,還可以根據(jù)需要讀取文件的特定位置,從而達(dá)到節(jié)省性能的目的。
到此這篇關(guān)于C++通過(guò)文件指針獲取文件大小的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C++ 文件指針獲取文件大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenCV通過(guò)透視變換實(shí)現(xiàn)矯正圖像詳解
這篇文章主要為大家詳細(xì)介紹了OpenCV如何通過(guò)透視變換實(shí)現(xiàn)將一張折射的圖片給矯正過(guò)來(lái),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02
C++標(biāo)準(zhǔn)模版庫(kù)(STL)之vector容器詳解
vector的功能和水桶一樣,就是用來(lái)裝東西的,并且vector還提供了迭代器來(lái)很方便的訪問(wèn)這些數(shù)據(jù),下面就讓我們一起看下如何使用C++的vector吧2023-03-03

