如何在C++中获取文件的大小?

10 浏览
0 Comments

如何在C++中获取文件的大小?

让我们创建一个补充问题来回答这个问题。\n在C++中,获取文件大小的最常见方法是什么?\n在回答之前,请确保它是可移植的(可以在Unix、Mac和Windows上执行),可靠的,易于理解且无需依赖库(不使用boost或qt,但例如glib是可以的,因为它是可移植的库)。

0
0 Comments

如何在C++中获取文件的大小?

在某些情况下,ftell,fseek方法可能无法提供准确的结果。特别是,如果使用已经打开的文件并且需要计算其大小,并且该文件正好以文本文件打开,则会得到错误的答案。

以下方法应始终适用,因为stat是Windows、Mac和Linux上的C运行时库的一部分。

#include 
long 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 ,GetFileSize(...)对我有用。

请注意,在Visual Studio中,long为4字节,因此您必须使用long long来获取Windows上大文件的正确大小。

这种方法适用于小于2GB的文件。

0
0 Comments

问题的原因:用户想要在C++中获取文件的大小。

解决方法:使用C++文件系统库中的file_size函数来获取文件的大小。

#include 
int 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页面!

0
0 Comments

如何在C++中获取文件大小?

在C++中,如果我们想要获取一个文件的大小,可以使用以下代码:

#include 
std::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)

0