VC++ 2012 无法读取大于 4 GB 的文件
VC++ 2012 can't read files larger than 4 GB
我正在尝试读取一个大型二进制文件,但我的代码无法打开大于 4GB 的文件。这是我的代码(我使用的是 Visual Studio 2012,在 x64 中编译):
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char* filename = "testfile";
ifstream file (filename, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
cout << "file is open" << endl;
}
else
{
cout << "couldn't open file" << endl;
}
return 0;
}
按照评论中的建议,我检查了 GetLastError()
的输出并进行了以下修改:
// ...
ifstream file (filename, ios::in|ios::binary|ios::ate);
DWORD lastError = GetLastError();
cout << lastError << endl; // -> 87
// ...
你有什么建议吗?
还不能评论,就这样吧。
我猜微软已经用 sizeof(std:streamoff) == sizeof(int)
实现了 std:streamoff
这意味着,当您尝试 ios::ate 时,对于大于 4GB(千兆字节)的文件,文件的流位置 val 溢出。 (我在这里胡乱猜测)
假设您的文件系统支持大于 4GB 的文件。
(编辑:谢谢,我错误地输入了 streampos 而不是 streamoff)
我以前用ios::ate
打开文件,因为我想用下面的代码获取文件大小:
filesize = file.tellg();
由于使用 ios::ate
打开文件对大于 4GB 的文件不起作用,我现在这样打开文件:
ifstream file (filename, ios::in|ios::binary);
没有ios::ate
并使用
file.seekg(0, ios::end);
filesize = file.tellg();
获取文件大小。
我正在尝试读取一个大型二进制文件,但我的代码无法打开大于 4GB 的文件。这是我的代码(我使用的是 Visual Studio 2012,在 x64 中编译):
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
char* filename = "testfile";
ifstream file (filename, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
cout << "file is open" << endl;
}
else
{
cout << "couldn't open file" << endl;
}
return 0;
}
按照评论中的建议,我检查了 GetLastError()
的输出并进行了以下修改:
// ...
ifstream file (filename, ios::in|ios::binary|ios::ate);
DWORD lastError = GetLastError();
cout << lastError << endl; // -> 87
// ...
你有什么建议吗?
还不能评论,就这样吧。
我猜微软已经用 sizeof(std:streamoff) == sizeof(int)
实现了 std:streamoff这意味着,当您尝试 ios::ate 时,对于大于 4GB(千兆字节)的文件,文件的流位置 val 溢出。 (我在这里胡乱猜测)
假设您的文件系统支持大于 4GB 的文件。
(编辑:谢谢,我错误地输入了 streampos 而不是 streamoff)
我以前用ios::ate
打开文件,因为我想用下面的代码获取文件大小:
filesize = file.tellg();
由于使用 ios::ate
打开文件对大于 4GB 的文件不起作用,我现在这样打开文件:
ifstream file (filename, ios::in|ios::binary);
没有ios::ate
并使用
file.seekg(0, ios::end);
filesize = file.tellg();
获取文件大小。