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

时间:2013-05-01 19:16:16

标签: c++ stl ifstream

我尝试使用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文件和300 MB文件,

5GB文件的输出是

Windows file size : 5430386900
 ifstream  file size: 1135419604

300MB文件的输出是

Windows file size : 318763632
 ifstream  file size: 318763632

在我看来它已经达到了一定的限度。

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

我正在尝试阅读一些大文件。如果ifstream无法读取大文件,那么哪个好的流阅读器可以使用?

3 个答案:

答案 0 :(得分:6)

我想你想说:

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

至少可以正常使用我已经存在的6GB文件。但我正在使用Visual Studio 2012进行编译。即使您的原始代码在该环境中也能正常工作。

所以我怀疑这是VS 2010上的std库中的一个错误,它在VS 2012中得到修复。无论是pos_type中运算符重载的错误还是该类不是64位知道的错误都是未知的。我必须安装VS 2010来验证,但这可能是问题。

答案 1 :(得分:4)

我稍微修改了你的代码,编译成了一些东西:

#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;
}

我在~3 Gigabyte文件上试过这个。使用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位带符号的数字作为文件大小,因此它们对iostream的实际限制可能是2千兆字节。有了VS 2012,这显然已得到纠正。

答案 2 :(得分:0)

最大文件大小由编译器和OS确定。

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

操作系统确定它可以支持的最大文件大小。

C ++语言不限制文件大小。

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

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

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