日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++獲取文件大小數值的三種方式介紹_C 語言

作者:cpp_learners ? 更新時間: 2022-11-21 編程語言

方式一

推薦使用此方式獲得文件大?。?/p>

C/C++、Window、Linux 環境都可以使用!

通過結構體struct stat獲得。

需要包含頭文件:#include <sys/stat.h> // struct stat

// 通過stat結構體 獲得文件大小,單位字節
size_t getFileSize1(const char *fileName) {
	if (fileName == NULL) {
		return 0;
	}
	// 這是一個存儲文件(夾)信息的結構體,其中有文件大小和創建時間、訪問時間、修改時間等
	struct stat statbuf;
	// 提供文件名字符串,獲得文件屬性結構體
	stat(fileName, &statbuf);
	// 獲取文件大小
	size_t filesize = statbuf.st_size;
	return filesize;
}

首先也是通過stat函數獲得文件的基本屬性,然后再從結構體中直接進行獲取文件大小就行,很簡單,也很好用。

直接拷貝代碼到自己的項目中去就可以用了!

方式二

C語言方式獲得文件大小

不推薦使用此方式

當文件太大時,移動文件光標指針會非常耗時!

// 通過打開文件 獲得文件大小,單位字節
long long getFileSize2(const char *fileName) {
	/* 
		解釋這里為什么用_fseeki64而不用fseek:
			_fseeki64可以兼容x64項目和x86項目
			fseek只能兼容x86項目

		這里說的兼容并不是能不能用的問題,而是準不準確的問題!
		在x64項目使用fseek,返回的數據可能會不準確!
	*/
	if (fileName == NULL) {
		return -1;
	}
	FILE *fp = NULL;
	long long fileSize = 0;
	// 打開文件
	errno_t err = fopen_s(&fp, fileName, "r");
	if (err != 0) {	// 不等0,打開文件失敗
		printf("Open file %s fail, code %d \n", fileName, err);
		return -1;
	}
	// 將文件光標位置從末尾處移動0個位置 -->也可以這樣說:(將文件光標從開頭位置移動到末尾位置)
	int errer = _fseeki64(fp, 0, SEEK_END);
	if (err != 0) {	// 不等0,移動文件光標失敗
		printf("Failed to move cursor!(SEEK_END)\n");
		return -1;
	}
	// 獲得當前文件指針位置,也就是間接獲得文件大小
	fileSize = _ftelli64(fp);
	/* 如果只是單純的獲取文件大小,后續沒有對文件有其他操作,下面將文件指針移動回來的代碼可以忽略 */
	// 將文件光標位置從開頭處移動0個位置 -->也可以這樣說:(將文件光標從末尾位置移動到開頭位置)
	errer = _fseeki64(fp, 0, SEEK_SET);
	if (err != 0) {	// 不等0,移動文件光標失敗
		printf("Failed to move cursor!(SEEK_SET)\n");
		return -1;
	}
	// 關閉文件
	fclose(fp);
	return fileSize;
}

解釋這里為什么用_fseeki64而不用fseek:

_fseeki64可以兼容x64項目和x86項目

fseek只能兼容x86項目

這里說的兼容并不是能不能用的問題,而是準不準確的問題!

在x64項目使用fseek,返回的數據可能會不準確!

通過移動文件光標的方式獲得文件大小。

首先將文件光標移動到文件末尾,然后獲取文件光標的位置,也就是獲得文件的大小,獲取后再將文件光標移動回文件開頭即可!

如果只是單純的獲取文件大小,后續沒有對文件有其他操作,將文件指針移動回來的代碼可以忽略。

直接拷貝代碼到自己的項目中去就可以用了!

方式三

C++ 方式獲得文件大小

不推薦使用此方式

當文件太大時,移動文件光標指針會非常耗時!

需要包含頭文件:

#include <iostream>

#include <fstream>

#include <string>

std::streampos getFileSize3(std::string fileName) {
	std::ifstream inFile;
	// 打開文件
	inFile.open(fileName, std::ios::in);
	if (inFile.is_open() == false) {	// 文件打開失敗
		std::cout << "Open file " << fileName << " fail!" << std::endl;
		return -1;
	}
	// 文件指針移動到末尾位置
	inFile.seekg(0, std::ios_base::end);
	// 獲取當前文件指針位置,也就是獲得文件大小
	std::streampos fileSize = inFile.tellg();
	// 文件指針移動到開頭文件
	inFile.seekg(0, std::ios_base::beg);
	// 關閉文件
	inFile.close();
	return fileSize;
}

其獲取思路和C語言類似!

都是通過移動文件光標指針獲得!

直接拷貝代碼到自己的項目中去就可以用了!

總結

在項目中,我還是比較喜歡使用第一種方式,因為其代碼量少,且獲取速度快,我可以不定義函數直接拷貝那幾句代碼到項目中去就可以使用了,很方便,省去了打開文件的操作!

原文鏈接:https://blog.csdn.net/cpp_learner/article/details/123018360

欄目分類
最近更新