使用C++的ios::ate获取错误的文件大小

3

我正在尝试使用C++获取文件的大小。代码如下:

 ifstream fin(filepth, ios::in | ios::binary | ios::ate);
    if (!fin.is_open()) {
        cout << "cannot open file:" << filepth << endl;
    }
    int len = fin.tellg();
    fin.seekg(0, ios::beg);
    fin.clear();
    cout << "file length is: " << len << endl;
    cout << "file length is: " << fs::file_size(fs::path(filepth)) << endl;

原来使用ios::ate的方法得到了错误的结果,我错过了什么并且如何得到正确的结果?

1
原来 ios::ate 方法得到了错误的结果。那么是什么错误的结果呢? - Gaurav Sehgal
1
这个数字与命令“ls”列出的文件大小(以字节为单位)不同。我知道原因了,是由于“int”变量无法表示高达9G的数字所导致的。 - coin cheung
std::basic_istream<CharT,Traits>::tellg 返回的是 pos_type,而不是 intpos_type 的问题在于它必须能够报告错误时返回 -1,因此可以使用 long(或32位上的 long long)或 ssize_t - David C. Rankin
2个回答

1

我找到了问题的原因。我的文件大小约为9GB,这超出了32位的int变量所能表示的范围。我使用了int64_t,问题得以解决。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接