我尝试使用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无法读取大文件,那么哪个好的流阅读器可以使用?
答案 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是限制因素。
总之,最大文件大小取决于编译器和操作系统。