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();

获取文件大小。