欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++獲取文件大小數(shù)值的三種方式介紹

 更新時(shí)間:2022年10月09日 09:47:44   作者:cpp_learners  
最近在做項(xiàng)目時(shí)經(jīng)常需要獲得文件的大小操作,雖然在網(wǎng)絡(luò)上已經(jīng)有許多篇博客介紹了,但是還是想總結(jié)出自己一篇,記錄一下自己在項(xiàng)目中是怎么獲得文件大小的

方式一

推薦使用此方式獲得文件大??!

C/C++、Window、Linux 環(huán)境都可以使用!

通過(guò)結(jié)構(gòu)體struct stat獲得。

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

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

首先也是通過(guò)stat函數(shù)獲得文件的基本屬性,然后再?gòu)慕Y(jié)構(gòu)體中直接進(jìn)行獲取文件大小就行,很簡(jiǎn)單,也很好用。

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

方式二

C語(yǔ)言方式獲得文件大小

不推薦使用此方式

當(dāng)文件太大時(shí),移動(dòng)文件光標(biāo)指針會(huì)非常耗時(shí)!

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

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

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

_fseeki64可以兼容x64項(xiàng)目和x86項(xiàng)目

fseek只能兼容x86項(xiàng)目

這里說(shuō)的兼容并不是能不能用的問(wèn)題,而是準(zhǔn)不準(zhǔn)確的問(wèn)題!

在x64項(xiàng)目使用fseek,返回的數(shù)據(jù)可能會(huì)不準(zhǔn)確!

通過(guò)移動(dòng)文件光標(biāo)的方式獲得文件大小。

首先將文件光標(biāo)移動(dòng)到文件末尾,然后獲取文件光標(biāo)的位置,也就是獲得文件的大小,獲取后再將文件光標(biāo)移動(dòng)回文件開(kāi)頭即可!

如果只是單純的獲取文件大小,后續(xù)沒(méi)有對(duì)文件有其他操作,將文件指針移動(dòng)回來(lái)的代碼可以忽略。

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

方式三

C++ 方式獲得文件大小

不推薦使用此方式

當(dāng)文件太大時(shí),移動(dòng)文件光標(biāo)指針會(huì)非常耗時(shí)!

需要包含頭文件:

#include <iostream>

#include <fstream>

#include <string>

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

其獲取思路和C語(yǔ)言類(lèi)似!

都是通過(guò)移動(dòng)文件光標(biāo)指針獲得!

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

總結(jié)

在項(xiàng)目中,我還是比較喜歡使用第一種方式,因?yàn)槠浯a量少,且獲取速度快,我可以不定義函數(shù)直接拷貝那幾句代碼到項(xiàng)目中去就可以使用了,很方便,省去了打開(kāi)文件的操作!

到此這篇關(guān)于C++獲取文件大小數(shù)值的三種方式介紹的文章就介紹到這了,更多相關(guān)C++獲取文件大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • c++如何將一個(gè)char轉(zhuǎn)化為string

    c++如何將一個(gè)char轉(zhuǎn)化為string

    這篇文章主要介紹了c++如何將一個(gè)char轉(zhuǎn)化為string問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 利用C++實(shí)現(xiàn)獲取文件夾下所有文件名

    利用C++實(shí)現(xiàn)獲取文件夾下所有文件名

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)獲取文件夾下所有文件名,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++有一定幫助,需要的可以參考一下
    2022-09-09
  • C++11 并發(fā)指南之多線(xiàn)程初探

    C++11 并發(fā)指南之多線(xiàn)程初探

    這篇文章主要介紹了C++11 并發(fā)指南之多線(xiàn)程初探,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 淺談C++日志系統(tǒng)log4cxx的使用小結(jié)詳解

    淺談C++日志系統(tǒng)log4cxx的使用小結(jié)詳解

    本篇文章是對(duì)C++日志系統(tǒng)log4cxx的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言中全局變量,局部變量,靜態(tài)局部變量的區(qū)分方式

    C語(yǔ)言中全局變量,局部變量,靜態(tài)局部變量的區(qū)分方式

    這篇文章主要介紹了C語(yǔ)言中全局變量,局部變量,靜態(tài)局部變量的區(qū)分方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • C語(yǔ)言結(jié)構(gòu)體的全方面解讀

    C語(yǔ)言結(jié)構(gòu)體的全方面解讀

    C 數(shù)組允許定義可存儲(chǔ)相同類(lèi)型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶(hù)自定義的可用的數(shù)據(jù)類(lèi)型,它允許你存儲(chǔ)不同類(lèi)型的數(shù)據(jù)項(xiàng)
    2021-10-10
  • C++超詳細(xì)梳理基礎(chǔ)知識(shí)

    C++超詳細(xì)梳理基礎(chǔ)知識(shí)

    這篇文章主要介紹了C++基礎(chǔ)概念,? 本次為C++的一個(gè)開(kāi)篇,重點(diǎn)是更好的理解C++相對(duì)于其他編程語(yǔ)言的一個(gè)特性,之后會(huì)持續(xù)更新,本次專(zhuān)欄計(jì)劃是掌握C++的基礎(chǔ)語(yǔ)法以及常用特性,并且從細(xì)節(jié)上去理解,需要的朋友可以參考一下
    2022-06-06
  • Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例

    Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例

    去水印是個(gè)麻煩事,本文就來(lái)介紹一種方法Opencv基于文字檢測(cè)去圖片水印的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • va_list(),va_start(),va_arg(),va_end() 詳細(xì)解析

    va_list(),va_start(),va_arg(),va_end() 詳細(xì)解析

    這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個(gè)頭文件.下面我們寫(xiě)一個(gè)簡(jiǎn)單的可變參數(shù)的函數(shù),該函數(shù)至少有一個(gè)整數(shù)參數(shù),第二個(gè)參數(shù)也是整數(shù),是可選的.函數(shù)只是打印這兩個(gè)參數(shù)的值
    2013-09-09
  • C語(yǔ)言實(shí)現(xiàn)AT指令A(yù)SCII碼的拼接處理流程

    C語(yǔ)言實(shí)現(xiàn)AT指令A(yù)SCII碼的拼接處理流程

    今天小編就為大家分享一篇關(guān)于C語(yǔ)言實(shí)現(xiàn)AT指令A(yù)SCII碼的拼接處理流程,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12

最新評(píng)論