【发布时间】:2013-05-01 19:16:15
【问题描述】:
我尝试使用 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 无法读取大文件,使用哪种流式阅读器比较好?
【问题讨论】:
-
我注意到您正在直接调用 _wstat64。你在编译 32 位二进制文件吗?您是否为
ifstream测试尝试了 64 位二进制文件? -
@WhozCraig:如果文件系统可以处理超过 2GB 的文件,32 位代码应该能够处理,否则这是一个非常糟糕的错误。
-
@BenVoigt 我同意,我只是好奇
stat()(不是_wstat64())在 32 位实现上的行为是否相似,以及ifstream在64位实现。 -
@WhozCraig:我正在编译的平台是 Win32。我没有尝试 64 位二进制。