最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

方式一

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

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

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

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

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

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

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

方式二

C語言方式獲得文件大小

不推薦使用此方式

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

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

		這里說的兼容并不是能不能用的問題,而是準(zhǔn)不準(zhǔn)確的問題!
		在x64項目使用fseek,返回的數(shù)據(jù)可能會不準(zhǔn)確!
	*/
	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;
	}
	// 將文件光標(biāo)位置從末尾處移動0個位置 -->也可以這樣說:(將文件光標(biāo)從開頭位置移動到末尾位置)
	int errer = _fseeki64(fp, 0, SEEK_END);
	if (err != 0) {	// 不等0,移動文件光標(biāo)失敗
		printf("Failed to move cursor!(SEEK_END)\n");
		return -1;
	}
	// 獲得當(dāng)前文件指針位置,也就是間接獲得文件大小
	fileSize = _ftelli64(fp);
	/* 如果只是單純的獲取文件大小,后續(xù)沒有對文件有其他操作,下面將文件指針移動回來的代碼可以忽略 */
	// 將文件光標(biāo)位置從開頭處移動0個位置 -->也可以這樣說:(將文件光標(biāo)從末尾位置移動到開頭位置)
	errer = _fseeki64(fp, 0, SEEK_SET);
	if (err != 0) {	// 不等0,移動文件光標(biāo)失敗
		printf("Failed to move cursor!(SEEK_SET)\n");
		return -1;
	}
	// 關(guān)閉文件
	fclose(fp);
	return fileSize;
}

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

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

fseek只能兼容x86項目

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

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

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

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

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

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

方式三

C++ 方式獲得文件大小

不推薦使用此方式

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

需要包含頭文件:

#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);
	// 獲取當(dāng)前文件指針位置,也就是獲得文件大小
	std::streampos fileSize = inFile.tellg();
	// 文件指針移動到開頭文件
	inFile.seekg(0, std::ios_base::beg);
	// 關(guān)閉文件
	inFile.close();
	return fileSize;
}

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

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

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

總結(jié)

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

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

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(一)

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之鏈表(一)

    鏈表是線性表的鏈?zhǔn)酱鎯Ψ绞健f湵淼膬?nèi)存是不連續(xù)的,前一個元素存儲地址的下一個地址中存儲的不一定是下一個元素。小編今天就將帶大家深入了解一下鏈表,快來學(xué)習(xí)吧
    2021-12-12
  • C語言 全局變量和局部變量詳解及實例

    C語言 全局變量和局部變量詳解及實例

    這篇文章主要介紹了C語言 全局變量和局部變量詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C語言實現(xiàn)學(xué)生選課系統(tǒng)完整版

    C語言實現(xiàn)學(xué)生選課系統(tǒng)完整版

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)學(xué)生選課系統(tǒng)的完整版,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C++實現(xiàn)LeetCode(13.羅馬數(shù)字轉(zhuǎn)化成整數(shù))

    C++實現(xiàn)LeetCode(13.羅馬數(shù)字轉(zhuǎn)化成整數(shù))

    這篇文章主要介紹了C++實現(xiàn)LeetCode(13.羅馬數(shù)字轉(zhuǎn)化成整數(shù)),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言多種方法實現(xiàn)一個函數(shù)左旋字符串中K個字符

    C語言多種方法實現(xiàn)一個函數(shù)左旋字符串中K個字符

    這篇文章主要為大家介紹了C語言多種方法實現(xiàn)一個函數(shù),可以左旋字符串中K個字符,文中附含詳細(xì)的示例講解,有需要的朋友可以借鑒參考下
    2021-10-10
  • Microsoft Visual C++ 程序的部署方法

    Microsoft Visual C++ 程序的部署方法

    由Microsoft Visual C++編譯的程序動態(tài)鏈接到C運(yùn)行時(/MD 或 /MDd),它必須運(yùn)行DLL的一份拷貝(通常被叫作MSVCRT.DLL 或 MSVCRxx.DLL,其中xx代表Visual C++的版本)
    2013-04-04
  • C語言字符串函數(shù)模擬實現(xiàn)流程介紹

    C語言字符串函數(shù)模擬實現(xiàn)流程介紹

    字符串函數(shù)(String processing function)也叫字符串處理函數(shù),指的是編程語言中用來進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計算長度,字符查找等的函數(shù)
    2022-09-09
  • 浮點數(shù)在計算機(jī)中存儲方式是怎樣的

    浮點數(shù)在計算機(jī)中存儲方式是怎樣的

    這篇文章介紹了浮點數(shù)在計算機(jī)中是如何存儲的,講解的比較詳細(xì),有需要的朋友可以參考一下。
    2016-06-06
  • vs2019創(chuàng)建dll以及使用的圖文教程

    vs2019創(chuàng)建dll以及使用的圖文教程

    本文主要介紹了vs2019創(chuàng)建dll以及使用的圖文教程,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C語言動態(tài)內(nèi)存規(guī)劃詳解

    C語言動態(tài)內(nèi)存規(guī)劃詳解

    這篇文章主要介紹了C語言動態(tài)內(nèi)存的規(guī)劃,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10

最新評論

宜兰县| 佳木斯市| 惠州市| 防城港市| 绥化市| 保山市| 德令哈市| 剑川县| 保定市| 扬州市| 宁波市| 依安县| 沁源县| 阿坝| 碌曲县| 文安县| 蓝田县| 亚东县| 衡阳县| 梅州市| 曲阳县| 保靖县| 东城区| 宜城市| 阿拉尔市| 尼木县| 荥经县| 盖州市| 惠来县| 蕉岭县| 抚宁县| 寻乌县| 巴里| 旬邑县| 沽源县| 古田县| 花莲市| 仪陇县| 佛学| 新余市| 宁阳县|