ifstream:: ifstream可以读取的最大文件大小是多少?

ifstream:: What is the maximum file size that a ifstream can read

本文关键字:ifstream 文件大小 多少 读取      更新时间:2023-10-16

我尝试使用ifstream读取3GB数据文件,它给了我错误的文件大小,而当我读取600MB文件时,它给了我正确的结果。除了错误的文件大小,我也无法读取整个文件使用ifstream。

下面是我使用的代码
        std::wstring name;
        name.assign(fileName.begin(), fileName.end());
        __stat64 buf;
        if (_wstat64(name.c_str(), &buf) != 0)
            std::cout << -1; // error, could use errno to find out more
        std::cout << " Windows file size : " << buf.st_size << std::endl;;

        std::ifstream fs(fileName.c_str(), std::ifstream::in | std::ifstream::binary);
        fs.seekg(0, std::ios_base::end);
        std::cout << " ifstream  file size: " << fs.tellg() << std::endl;

3GB文件的输出为

 Windows file size : 3147046042
 ifstream  file size: -1147921254

而600 MB文件的输出是

 Windows file size : 678761111
 ifstream  file size: 678761111

为了以防万一,我还测试了5GB文件和300mb文件,

5GB文件的输出为

Windows file size : 5430386900
 ifstream  file size: 1135419604

300MB文件的输出为

Windows file size : 318763632
 ifstream  file size: 318763632

在我看来,它似乎达到了某种极限。

我在Windows机器上使用Visual Studio 2010测试代码,该机器有足够的内存和磁盘空间。

我正在尝试读取一些大文件。如果ifstream不能读取大文件,哪个是好的流阅读器?

我想你要说:

std::cout << " ifstream  file size: " << fs.tellg().seekpos() << std::endl;

至少对于我放置的6GB文件可以正确工作。但我是用Visual Studio 2012编译的。甚至你的原始代码在这种环境下也能正常工作。

所以我怀疑这是VS 2010的std库中的一个bug,在VS 2012中得到了修复。这是pos_type的操作符重载中的错误,还是该类不支持64位,目前尚不清楚。我必须安装VS 2010来验证,但这可能是问题所在。

我稍微修改了一下你的代码,使其可以编译:

#include <fstream>
#include <iostream>
#include <string>
#include <windows.h>
int main() { 
    std::wstring name(L"whatever.txt");
    __stat64 buf;
    if (_wstat64(name.c_str(), &buf) != 0)
        std::cout << -1; // error, could use errno to find out more
    std::cout << " Windows file size : " << buf.st_size << std::endl;;

    std::ifstream fs(name.c_str(), std::ifstream::in | std::ifstream::binary);
    fs.seekg(0, std::ios_base::end);
    std::cout << " ifstream  file size: " << fs.tellg() << std::endl;
    return 0;
}

我在一个~ 3gb的文件上尝试了这个。对于VS 2012(32位或64位),它产生:

 Windows file size : 3581853696
 ifstream  file size: 3581853696

对于32位的VS 2008(对不起,现在没有安装VS 2010的副本),我得到:

 Windows file size : 3581853696
 ifstream  file size: -713113600

所以,看起来旧版本的VS/vc++使用32位带符号的数字来表示文件大小,所以他们对iostreams的实际限制可能是2gb。在VS 2012中,这个问题显然得到了纠正。

最大文件大小由编译器和操作系统决定。

编译器可以控制访问文件大小的变量的大小。

操作系统决定它所能支持的最大文件大小。

c++语言对文件大小没有限制。


示例1:编译器可以为文件位置变量分配16位,而操作系统可能使用32位指针来表示最大文件大小。在这种情况下,编译器是限制因素。

示例2:
编译器可以使用32位作为文件位置变量,但操作系统使用24位。在本例中,操作系统是限制因素。

总之,最大文件大小取决于编译器和操作系统。