C/C++ 三种方式获得文件的大小

【C语言】获取文件大小的两种方式 目录通过文件指针获取文件大小通过文件描述符获取文件大小 因为音视频开发的需要,经常会写一些文件输入输出的测试程序,常常用到获取文件大小的函数。本篇文章就记录一下笔者常用的两种获取文件大小的方式。 通过文件指针获取文件大小 文件指针 就是调用 fopen() 函数返回的指向FILE结构体的指针,通过文件指针可以对文件进行打开、关闭、读写以及控制读写位置等操作。 这里我们主要用到两个函数,首先是 fseek(),用来移动文件指针,fseek的用法: int fseek(FILE *stream, long of 阅读详情
AI摘要

本文介绍了三种在C/C++中不同场景下获取文件大小的方法,推荐使用结构体`structstat`快速获取,避免移动大文件指针的耗时问题。

最近在做项目时经常需要获得文件的大小操作,虽然在网络上已经有许多篇博客介绍了,但是还是想总结出自己一篇,记录一下自己在项目中是怎么获得文件大小的!


方式一

推荐使用此方式获得文件大小!
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语言类似!
都是通过移动文件光标指针获得!

直接拷贝代码到自己的项目中去就可以用了!


总结

在项目中,我还是比较喜欢使用第一种方式,因为其代码量少,且获取速度快,我可以不定义函数直接拷贝那几句代码到项目中去就可以使用了,很方便,省去了打开文件的操作!

获取文件大小的C++实现方法 然后,我们可以使用seekg()函数将文件指针移动到文件的末尾,使用tellg()函数获取文件指针的位置,即文件的大小。如果您需要在程序中经常获取文件大小,则可以将上述代码封装在一个函数内,并在需要时调用该函数即可。这是一种简单而有效的方法,可以快速获取文件的大小。如果您想在C++程序中获取文件的大小,本文提供了一种简单而有效的方法。然后,我们使用tellg()函数获取文件指针的位置,这也就是文件的大小。在这段代码中,我们传递文件路径作为参数,然后使用ifstream对象打开该文件。希望本文对您有所帮助! 阅读详情

相关推荐

C语言:获取文件大小的两种方式

ftell可以返回文件当前位置的偏移量,所以可以先通过fseek将文件当前位置挪到尾部,然后再通过ftell获取文件的大小。2.通过fstat,该函数可以获取文件的相关信息,其中有关于文件大小的值。文件testfile.txt的内容是:123456。可以看到正确的获取了文件的大小。

风静如云的博客 1118

c++获取文件大小的几种方式

获取文件大小的几种方式

wyw0000的博客 4170

C++中文件后缀的区别:cxx、cpp和txx,c、cc和cpp、hpp和h等

文章目录1. cxx、cpp和txx 又开始接触C++了,接触我对代码一开始认识的内容咧,加油 1. cxx、cpp和txx 参考: ITK官方论坛:[Insight-users] Difference between .cxx and .cpp, .txx and .h OSCHINA开源中国:txx cxx cpp 的区别 github的issue:Recognize *.cxx, *.hxx, *.tpp, *txx, *.ipp, and *.ixx files as C++ #539 stack

啷个哩个啷 2万+

C++获取文件大小的几种方法

#include #include #include #include #include using namespace std; int main() { char *filepath = "D:\\1.TXT"; //方法一 HANDLE handle = CreateFileA( filepath, FILE_READ_EA, FILE_SHARE_READ, 0

marcellen的专栏 1万+

DaVinci Developer中枚举类型变量的创建与实战应用

本文详细介绍了在DaVinci Developer中创建和使用枚举类型变量的方法与实战应用。通过智能温控系统的案例,阐述了枚举类型在嵌入式开发中的核心价值,包括提升代码可读性、类型安全性和维护便捷性。文章还提供了枚举类型在状态机实现和多模块协同中的高级应用技巧,以及调试与优化的实用建议。

ik678901234的博客 511

CocosCreator | 自定义启动页之H5

01 效果对比 默认启动页: 自定义启动页: 02 启动页存在的意义 我们在 creator 中的开发的游戏都是基于 cocos engine,所以在展示我们的游戏之前,是必须要先加载 cocos engine,然后才是我们自己的业务代码 流程图如下: 而构建完成后未精简的 cocos engine 代码为 1.9M 如果再加上物理相关代码的话,一共是2M 别忘了,我们自己的首场景也要加载过程哦 所以,从游戏启动,到真...

Valiancer 5895

C/C++ 获取文件大小

在C语言中测试文件的大小,主要使用二个标准函数。 1.fseek   函数原型:int fseek ( FILE * stream, long int offset, int origin );   参数说明:stream,文件流指针;offest,偏移量;orgin,原(始位置。其中orgin的可选值有SEEK_SET(文件开始)、SEEK_CUR(文件指针当前位置)、SEEK...

acxm45824的博客 3090

`全网最细!! 入门必看Git教程链接:https://gitee.com/all-about-git`

全网 Git 入门教程 gitee.com。如果显示The requested URL returned error: 403错误,那就表示没有和window本地建立token令牌

qq_37855368的博客 3747

C/C++读取文件大小

C/C++读取大文件字节数的两种方法第一中方法第二种方法 第一中方法 // An highlighted block FILE *fp=fopen("C:\\Windows\\explorer.exe","rb");//打开文件 int size=0; fseek(fp,0,SEEK_END);//将文件位置指针内置于文件结尾 size=ftell(fp);//得到当前位置...

sinat_28305511的博客 1236

计算机组成原理课程设计_微程序控制的简单模型机设计

微程序控制的简单模型机设计 要求 基本要求 完成一个简单主机的设计,模型机应具备如下能力:在自行设计的指令集基础上,运行自行编写的简单用户程序,实现特定运算功能。 弹性要求 在此基础上,完成必要的扩展,实现模型机的功能扩展设计,包括:实现多种运算功能(指令集的扩充)、支持更为丰富的寻址方式、有更为完善的微程序设计等。 实验软件和硬件环境 QuartusII, FPGA计算机组...

sailist的记录站 3万+

解决LangChain4j报错HTTP/1.1 header parser received no bytes

当使用调用自己部署的大模型服务时报错: 报错信息如下:

weixin_44455388的博客 2334

【C写文件】C/C++读写文本文件、二进制文件/文件读写

目录 一:目的 二:C语言文本文件读写 1. 文本文件写入 2. 文本文件读取 三:C语言二进制文件读写 1. 二进制文件写入 2.二进制文件读取 四:C++文本文件读写 1. 文本文件写入 2.文本文件读取 五:C++二进制文件读写 1. 二进制文件写入 2.二进制文件读取 六 总结 获取文件大小 方法一 方法二 一:目的 掌握C语言文本文件读写方式...

我的笔记本 8613

MONAILabel in 3D Slicer 案例1: 在腹部CT中自动分割脾脏

MONAILabel in 3D Slicer 案例1: 在腹部CT中自动分割脾脏。

Tina姐的博客 1938

C/C++编程:log4cpp使用学习

简介 Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。 Log4cpp有如下优点: 提供了可扩展的多种日志记录方式; 提供了NDC(嵌套诊断上下文),可用于多线程、多场景的跟踪调试; 提供了完整的日志动态优先级控制,可随时调整需要记录的日志优先级 可通过配置文件完成所有配置并动态加载; 性能优秀,内存

OceanStar的博客 4019

pytest学习和使用19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume)

【代码】pytest学习和使用19-pytes断言失败后,怎样保持后续的断言继续执行?

虫无涯的博客 1390

使用CubeMX配置STM32H7的FreeRTOS

本文将介绍如何使用CubeMX配置STM32H7的FreeRTOS,并提供相应的源代码示例。通过使用CubeMX,你可以轻松地配置FreeRTOS和系统资源,并生成相应的初始化代码和配置文件。在"FreeRTOS"选项卡的"Tasks"部分,可以配置系统中的任务。首先,打开CubeMX软件。在"FreeRTOS"选项卡的"Resources"部分,你可以配置FreeRTOS使用的资源,例如,堆内存和信号量。例如,我们可以创建两个简单的任务,一个任务将在循环中切换LED的状态,另一个任务将通过串口打印消息。

JeeVue的博客 711

(莫寒C++成长贴)C/C++ 获取文件大小

C++获取文件大小C++获取文件大小利用ifstream利用C函数利用Windows _stat函数参考文章 C++获取文件大小 利用ifstream 以下操作需要包含头文件fstream 和 string size_t GetFileSize(const std::string& file_name){ std::ifstream in(file_name.c_str()); in...

莫寒技术人生 671

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

VS Code c/cpp 插件和配置

参考链接:https://www.cnblogs.com/esllovesn/p/10012653.html VS Code 界面优美,启动速度快。 特别是打开 100m 以上的 log。 大型项目首推source insight4 使用 VS Code 替代 notpad++ 作为 c/cpp 编辑器,并不把 VS Code 配置成 IDE 。 插件: Bo...

qq_38907791的博客 7587

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

c获得文件大小

 1.MFC中的方法:(C++)CFileStatus status;CFile::GetStatus("D://test.txt",status);long lSizeOfFile;lSizeOfFile = status.m_size;lSizeOfFile的值就是D://test.txt文件的大小2.标准C获得文件大小的5种方法(注意:"__FILE_

wzw200的专栏 1169

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++获取文件大小方式(MFC,linux,C++,C)

四种C++获取指定文件的大小 #include < iostream> #include < io.h> #include < sys\stat.h> #include < afx.h> #define _AFXDLL using namespace std; void main() { // 此文件在工程打开状态下为不可访问 c...

thecentury的博客 10万+

【C/C++ 应用开发 检测文件 】详解 C/C++ 中常用的 5 种文件存在检查方式

不再迷茫 && 详解 C/C++ 中常用的 5 种文件存在检查方式

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 4920

总结C/C++下读取文件大小的方法

C下: 1、依靠定位文件位置从而获得文件大小。 ① int GetFileSize(char *filename) { int size = 0; FILE *fp = fopen(filename, "rb"); if (fp) { fseek(fp, 0, SEEK_END); size = ftell(fp);

fuding200209的专栏 1361

C/C++ Native 包大小测量

文章目录C/C++ Native 包大小测量测试 demoAndroid .so 动态库包大小测量Bloaty使用 Bloaty分析与裁剪iOS .a 静态库包大小测量基于 Xcode 的 .a 测试方法0. 编译 iOS 库1. 新建 ios 工程2. 打开 `Write Link Map File`3. 分析 Link Map File总结 C/C++ Native 包大小测量 公司内部有很多 C/C++ native 库,例如 XXSDK、YYYSDK、ZZZSDK 等等,随着业务迭代包体积也在逐渐膨

记录学习的过程 4152

C/C++获取文件大小

利用fseek()与ftell()函数可以计算出一个文件的大小。

bluebird_shao的专栏 5392

C/C++学习记录:深入理解三种传参方式

C/C++学习记录:深入理解三种传参方式   之前对传参这方面的东西一直是知其然不知所以然。概念用法怎么用都知道,但是其真正的内部操作流程确实是理解不足。这两天一直在总结shell脚本的笔记,写累了正好研究一下传参这方面的内容。   这篇笔记中记录了关于这方面我的理解过程和心得。关于本篇笔记的深度,也是到汇编为止不再深入,就我个人理解来看已经是足够了。 目录一、关于三种传参方式1. 值传参1.1 简单总结1.2 我的疑问2. 引用传参2.1 简单总结2.2 我的疑问3. 指针传参3.1 简单总结3.2 我

这里是河边 2471
上一篇: C/C++ 使用 tinyxml库 操作XML格式文件(创建、插入、删除、修改、解析)
下一篇: C/C++ Windows和Linux通用的一个函数,从文件路径中 提取 (文件名) 和 (文件后缀)
cpp_learners
博客等级 码龄7年 1526粉丝 274原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值