VC ++ 2012无法读取大于4 GB的文件

时间:2015-07-30 11:17:45

标签: c++ file visual-studio-2012 fstream large-files

我试图读取大型二进制文件,但我的代码无法打开大于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
// ...

你有什么建议吗?

2 个答案:

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

获取文件大小。