
在C++中获取文件大小有多种方法,常用的方式包括使用标准库中的 std::filesystem::file_size 函数(C++17起支持)和通过文件流结合 seekg 与 tellg 进行定位计算。下面分别介绍这两种主流方法。
使用 std::filesystem::file_size 获取文件大小
从 C++17 开始,标准库提供了 filesystem 模块,其中的 file_size 函数可以直接返回指定文件的字节数,使用简单且不易出错。
示例代码:
#include <iostream> #include <filesystem> <p>int main() { const char* filename = "example.txt"; if (std::filesystem::exists(filename)) { std::uintmax_t size = std::filesystem::file_size(filename); std::cout << "文件大小: " << size << " 字节" << std::endl; } else { std::cout << "文件不存在" << std::endl; } return 0; }
注意:编译时需要启用 C++17 或更高版本,并链接 stdc++fs(部分编译器如 g++ 需添加 -lstdc++fs)。
使用 seekg 和 tellg 通过输入流获取大小
对于不支持 C++17 的环境,可以使用 ifstream 结合 seekg 和 tellg 方法来测量文件大小。基本思路是将读指针移到文件末尾,再用 tellg 获取当前位置,即为文件总长度。
示例代码:
#include <iostream> #include <fstream> <p>long getFileSize(const char* filename) { std::ifstream file(filename, std::ios::binary | std::ios::ate); if (!file.is_open()) { return -1; // 打开失败 } long size = file.tellg(); // 当前位置即文件末尾偏移量 file.close(); return size; }</p><p>int main() { long size = getFileSize("example.txt"); if (size != -1) { std::cout << "文件大小: " << size << " 字节" << std::endl; } else { std::cout << "无法打开文件" << std::endl; } return 0; }
关键点说明:
- 打开文件时使用 std::ios::ate 标志会直接将读指针定位到文件末尾。
- 使用二进制模式(std::ios::binary)避免文本模式下换行符转换影响大小判断。
- tellg 返回的是当前读指针的位置,在 ate 模式下就是文件总字节数。
常见问题与注意事项
两种方法各有适用场景:
- filesystem::file_size 更现代、简洁,适合新项目;但需注意兼容性。
- 流方式兼容性好,适用于老标准或嵌入式环境,但需手动处理打开失败等情况。
- 不能对标准输入或其他非普通文件(如设备文件)调用 file_size,否则会抛异常或返回错误。
基本上就这些。选择哪种方式取决于你的编译环境和项目要求。如果条件允许,优先使用 std::filesystem::file_size,代码更清晰安全。
立即学习“C++免费学习笔记(深入)”;