如何在C++中获取文件的大小?
如何在C++中获取文件的大小?
让我们创建一个补充问题来回答这个问题。\n在C++中,获取文件大小的最常见方法是什么?\n在回答之前,请确保它是可移植的(可以在Unix、Mac和Windows上执行),可靠的,易于理解且无需依赖库(不使用boost或qt,但例如glib是可以的,因为它是可移植的库)。
如何在C++中获取文件的大小?
在某些情况下,ftell,fseek方法可能无法提供准确的结果。特别是,如果使用已经打开的文件并且需要计算其大小,并且该文件正好以文本文件打开,则会得到错误的答案。
以下方法应始终适用,因为stat是Windows、Mac和Linux上的C运行时库的一部分。
#includelong GetFileSize(std::string filename) { struct stat stat_buf; int rc = stat(filename.c_str(), &stat_buf); return rc == 0 ? stat_buf.st_size : -1; }
或者
long FdGetFileSize(int fd) { struct stat stat_buf; int rc = fstat(fd, &stat_buf); return rc == 0 ? stat_buf.st_size : -1; }
如果您需要处理非常大的文件(>2GB),如果可用,可以考虑调用`stat64`和`fstat64`。
上述代码对C和C++都是可移植的。
对于以二进制模式打开流的提及很有帮助。这修复了我在使用fseek()+ftell()和read()大小时遇到的问题。
我需要添加#include
请注意,在Visual Studio中,long为4字节,因此您必须使用long long来获取Windows上大文件的正确大小。
这种方法适用于小于2GB的文件。
问题的原因:用户想要在C++中获取文件的大小。
解决方法:使用C++文件系统库中的file_size函数来获取文件的大小。
#includeint main(int argc, char *argv[]) { std::filesystem::path p{argv[1]}; std::cout << "The size of " << p.u8string() << " is " << std::filesystem::file_size(p) << " bytes.\n"; }
需要注意的是,C++17中引入了文件系统库。这个方法是否比tellg更快呢?我们真的需要先将文件名规范化吗?在我个人看来,这是最佳答案。我刚在g++8上进行了基准测试,它比seekg和tellg稍微快一些,并且结果是正确的。总是从底部开始阅读StackOverflow页面!
如何在C++中获取文件大小?
在C++中,如果我们想要获取一个文件的大小,可以使用以下代码:
#includestd::ifstream::pos_type filesize(const char* filename) { std::ifstream in(filename, std::ifstream::ate | std::ifstream::binary); return in.tellg(); }
这段代码首先打开了一个ifstream对象,并使用`std::ifstream::ate`和`std::ifstream::binary`参数来打开文件并定位到文件末尾。然后,使用`tellg()`函数获取当前文件指针的位置,即文件大小。最后,返回文件大小。
需要注意的是,有人提出了`tellg()`函数不一定能正确返回文件大小的问题。对于大于4GB的文件,这个方法在64位的VS 2013中可能会出错。因此,可以使用`seekg(0, end)`和`tellg()`函数作为解决方法。
此外,还有人提出了使用文件系统中的stat函数获取文件大小的方法。这种方法不需要打开文件,效率更高且不会产生副作用。
总结一下,获取文件大小的方法有两种:一种是使用ifstream打开文件并使用tellg()函数获取文件指针位置,另一种是使用文件系统的stat函数。其中,使用tellg()函数的方法可能存在一些问题,特别是对于大文件和特定操作系统的情况。因此,使用文件系统的stat函数可能更可靠和高效。
参考链接:
- [http://www.cplusplus.com/doc/tutorial/files/](http://www.cplusplus.com/doc/tutorial/files/)
- [http://stackoverflow.com/a/22986486/1835769](http://stackoverflow.com/a/22986486/1835769)
- [https://connect.microsoft.com/VisualStudio/Feedback/Details/1683089](https://connect.microsoft.com/VisualStudio/Feedback/Details/1683089)