ifstream:: ifstream可以读取的最大文件大小是多少?
ifstream:: What is the maximum file size that a ifstream can read
我尝试使用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位。在本例中,操作系统是限制因素。
总之,最大文件大小取决于编译器和操作系统。
- ifstream文件在从行中读取时被清除
- 读取某些文件时出现分段错误,似乎与文件大小无关
- 构建挂起,即使是适度的文件大小
- 如何在Windows内核中获取文件大小
- 虽然循环不读取整个 ifstream 文件
- 为什么 QFileSystemWatcher 会发出多个信号?而 QFileInfo 首次写入零文件大小
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 使用 C++ iOS::ate 获取错误的文件大小
- 相同的源代码,不同的可执行文件大小?
- 为什么未关闭的文件大小为 4 字节
- 如何确保我的"ifstream"文件对象指向的文件内容已更新?
- 读取二进制文件大小的短自上周以来停止工作
- 如何减小C++标准库libstdc++.so文件大小
- 为什么我可以将 ifstream 文件置于 if 条件?
- 文件大小和缓冲区过冲
- 将 ifstream 文件和每一行读取到数组中
- 如何从范围 v3 的istream_range中检索文件大小?
- 使用ifstream::seekg和tellg获取文件大小
- 从ifstream文件读取时给出了错误的大小
- ifstream:: ifstream可以读取的最大文件大小是多少?