小智 85
您可以使用ios::ate
标志(和ios::binary
标志)打开文件,因此该tellg()
函数将直接为您提供文件大小:
ifstream file( "example.txt", ios::binary | ios::ate);
return file.tellg();
Run Code Online (Sandbox Code Playgroud)
Ara*_*raK 58
你可以寻找到最后,然后计算差异:
std::streampos fileSize( const char* filePath ){
std::streampos fsize = 0;
std::ifstream file( filePath, std::ios::binary );
fsize = file.tellg();
file.seekg( 0, std::ios::end );
fsize = file.tellg() - fsize;
file.close();
return fsize;
}
Run Code Online (Sandbox Code Playgroud)
Job*_*bin 26
不要tellg
用于确定文件的确切大小.确定的长度tellg
将大于可从文件中读取的字符数.
从stackoverflow问题tellg()函数给出错误的文件大小? tellg
不报告文件的大小,也不报告从字节开始的偏移量.它会报告一个令牌值,以后可以用它来寻找同一个地方,仅此而已.(甚至不能保证您可以将类型转换为整数类型.).对于Windows(以及大多数非Unix系统),在文本模式下,tellg返回的内容和必须读取到该位置的字节数之间没有直接和直接的映射.
如果确切地知道您可以读取多少字节很重要,那么可靠地执行此操作的唯一方法是阅读.您应该可以使用以下内容执行此操作:
#include <fstream>
#include <limits>
ifstream file;
file.open(name,std::ios::in|std::ios::binary);
file.ignore( std::numeric_limits<std::streamsize>::max() );
std::streamsize length = file.gcount();
file.clear(); // Since ignore will have set eof.
file.seekg( 0, std::ios_base::beg );
Run Code Online (Sandbox Code Playgroud)
像这样:
long begin, end;
ifstream myfile ("example.txt");
begin = myfile.tellg();
myfile.seekg (0, ios::end);
end = myfile.tellg();
myfile.close();
cout << "size: " << (end-begin) << " bytes." << endl;
Run Code Online (Sandbox Code Playgroud)
从 C++17 开始,我们有了std::filesystem::file_size
. 严格来说,这并不使用istream
or ,fstream
但它是迄今为止在标准 C++ 中读取文件大小的最简洁、最正确的方法。
#include <filesystem>
...
auto size = std::filesystem::file_size("example.txt");
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
139790 次 |
最近记录: |