C++获取文件大小数值的三种方式介绍

目录
  • 方式一
  • 方式二
  • 方式三
  • 总结

方式一

推荐使用此方式获得文件大小!

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++获取文件大小数值的三种方式介绍的文章就介绍到这了,更多相关C++获取文件大小内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++获取文件大小的4种常见技巧分享

    C++编程语言在程序开发应用中能够帮助我们轻松的完成许多功能需求.比如今天为大家介绍的C++获取文件大小的方法,就可以以多种方式轻松的实现.现在将会实现方法呈现给大家,以便大家参考. C++获取文件大小代码示例: #include < iostream> #include < io.h> #include < sys\stat.h> #include < afx.h> #define _AFXDLL using namespace std; void mai

  • C++通过文件指针获取文件大小的方法实现

    目录 1. 叙述 2. 结论 1. 叙述 对于读取本地文件,很多时候需要预先知道本地文件的大小在进行读取.网上给出的方案是移动文件指针,计算文件头和文件尾的偏移,计算出文件的大小.但是我总觉得这样做可能会与读取文件一样消耗性能,为了解决这个问题,我写了如下例子验证了一下. #include <iostream> #include <fstream> #include<Windows.h> using namespace std; class CTimer { publi

  • C++获取文件大小数值的三种方式介绍

    目录 方式一 方式二 方式三 总结 方式一 推荐使用此方式获得文件大小! C/C++.Window.Linux 环境都可以使用! 通过结构体struct stat获得. 需要包含头文件:#include <sys/stat.h> // struct stat // 通过stat结构体 获得文件大小,单位字节 size_t getFileSize1(const char *fileName) { if (fileName == NULL) { return 0; } // 这是一个存储文件(夹)

  • Action获取请求参数的三种方式

    方式一:Action本身作为Model对象,通过属性注入(Setter)方法讲参数数据封装到Action中 具体为:在Action中,提供和参数名相同的几个属性,并为其提供set方法,那么,该参数会被自动封装 到该几个属性中. 方式二:创建独立的Model对象,还是通过属性注入的方法将请求数据封装到Model对象中 具体为:另外创建一个专门的类,并在其中添加几个和请求参数名相同的属性,,此时,在表单中,需要讲参数名, 写成Model的一个具体对象名.参数名的方式,然后在Action中,需要定义一

  • Java中获取键盘输入值的三种方法介绍

    程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这种情况我们就束手无策,请你看以下三种解决方法吧: 以下将列出几种方法: 方法一:从控制台接收一个字符,然后将其打印出来 public static void main(String [] args) throws IOException{ System.out.print("Enter a char

  • Android获取view高度的三种方式

    本文为大家分享了Android获取view高度的方法,供大家参考,具体内容如下 getMeasuredHeight()与getHeight的区别 实际上在当屏幕可以包裹内容的时候,他们的值相等, 只有当view超出屏幕后,才能看出他们的区别: getMeasuredHeight()是实际View的大小,与屏幕无关, 而getHeight的大小此时则是屏幕的大小. 当超出屏幕后,getMeasuredHeight()等于getHeight()加上屏幕之外没有显示的大小 具体方法 我们知道在oncr

  • CZGL.ProcessMetrics处理监控数据的三种方式介绍

    目录 导读 三种方式处理监控数据 主动推送 ASP.NET Core 自定义URL .NET diagnostics 自定义监控指标 导读 CZGL.ProcessMetrics 是一个 Metrics 库,能够将程序的 GC.CPU.内存.机器网络.磁盘空间等信息记录下来,使用 Prometheus 采集信息,然后使用 Grafana 显示. 周日花了时间把这个库更新,修复了一些 Bug,增加了一些有趣的功能,支持多服务器多应用,支持 wpf.winfrom..NET Core 等应用,在不需

  • JavaScript获取tr td 的三种方式全面总结(推荐)

    /* 第一种,原生的js,先获取table然后获取tr标签,然后遍历td */ // $('#selectIds').val(""); // var table = document.getElementById("tb_table");//获取第一个表格 // var array = table.getElementsByTagName("tr");//所有tr // for(var i = 1; i < array.length; i+

  • JS获取html对象的几种方式介绍

    document.getElementById("zx"); 通过ID获取html元素对象,ID号在html文档当中应该是唯一的.返回的是唯一element对象.并且所有浏览器都兼容. document.getElementsByTagName("span")[0]; 通过标签查找html对象,由于html标签在一个页面中可能重复很多次,所以当前页面返回的是一个数组.可以根据标签出现的位置定位元素的对象.所有浏览器都兼容. document.getElementsB

  • Java中获取时间戳的三种方式对比实现

    Java中获取时间戳 三种方式对比 最近项目开发过程中发现了项目中获取时间戳的业务.而获取时间戳有以下三种方式,首先先声明推荐使用System类来获取时间戳,下面一起看一看三种方式. 1.System.currentTimeMillis() System类中的currentTimeMillis()方法是三种方式中效率最好的,运行时间最短.开发中如果设计到效率问题,推荐使用此种方式获取. System.currentTimeMillis() 2.new Date().getTime() 除了Sys

  • CodeIgniter中使用cookie的三种方式详解

    cookie在php程序设计中应用十分广泛,本文所述CodeIgniter中使用cookie主要有以下三种方式,读者可以根据自身项目需求酌情采用. 第一种方式:采用php原生态的方法设置的cookie的值 setcookie("user_id",$user_info['user_id'],86500); setcookie("username",$user_info['username'],86500); setcookie("password"

  • 基于$.ajax()方法从服务器获取json数据的几种方式总结

    一.什么是json json是一种取代xml的数据结构,和xml相比,它更小巧但描述能力却很强,网络传输数据使用流量更少,速度更快. json就是一串字符串,使用下面的符号标注. {键值对} : json对象 [{},{},{}] :json数组 "" :双引号内是属性或值 : :冒号前为键,后为值(这个值可以是基本数据类型的值,也可以是数组或对象),所以 {"age": 18} 可以理解为是一个包含age为18的json对象,而[{"age":

随机推荐