C++通過文件指針獲取文件大小的方法實現

1. 敘述 

對於讀取本地文件,很多時候需要預先知道本地文件的大小在進行讀取。網上給出的方案是移動文件指針,計算文件頭和文件尾的偏移,計算出文件的大小。但是我總覺得這樣做可能會與讀取文件一樣消耗性能,為瞭解決這個問題,我寫瞭如下例子驗證瞭一下。

#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);//獲得時鐘頻率
	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;//獲得對應的時間值

	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 << "獲取文件長度耗時:" << timer.time_out() << "秒" << endl;

	timer.time_in();

	char *buff = new char[len];

	ifs.read(buff, len);
	delete[]buff;

	timer.time_out();
	cout << "讀取文件耗時:" << timer.time_out() << "秒" << endl;

	return 1;
}

如上所示,我寫瞭一個計時器,分別統計偏移文件指針計算文件長度與讀取整個文件的耗時,運行結果如下:

2. 結論

可以看到,偏移文件指針帶來的時間消耗非常小,幾乎可以忽略不記。通過這個方法,不僅可以很快計算文件長度,還可以根據需要讀取文件的特定位置,從而達到節省性能的目的。

到此這篇關於C++通過文件指針獲取文件大小的方法實現的文章就介紹到這瞭,更多相關C++ 文件指針獲取文件大小內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: