我试图读取大型二进制文件,但我的代码无法打开大于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
// ...
你有什么建议吗?
答案 0 :(得分:0)
无法发表评论,所以这样做。
我猜微软已经用sizeof(std:streamoff)== sizeof(int)实现了std:streamoff
这意味着,当您尝试使用ios :: ate时,对于大于4GB(gibibytes)的文件,文件的流位置val会溢出。 (我在这里做了一个疯狂的猜测)
这假设您的文件系统支持大于4GB的文件。
(编辑:谢谢,我错误地把streampos放在了streamoff上)
答案 1 :(得分:0)
我曾经用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();
获取文件大小。