C++ 完全读取文件,其中大小>2GB (Win64)

问题描述 投票:0回答:1

文件显示在 1.1GB-3.1GB 范围内。服务器有 64GB RAM(较小的服务器有 24GB)。

所以我想我只需将整个内容读入内存而不是使用块。 (块可能会落在 crlf 位置之外,因此我必须稍微回溯。更简单的代码可以吞掉整个内容)。

ReadFile 和 ReadFileEx 似乎陷入了 32 位领域,即使在 Win64 中构建也是如此。我觉得我错过了一些明显的东西。

#include <Windows.h>
#include <iostream>
using namespace std;

int main()
{
    cout << "start\r\n";
    HANDLE hInput;
    hInput = CreateFile(L"My-giant-File.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);

    long long amountOfDataToRead = 4000000000; //Arbitrary 4Gb read buffer
    byte * buffer = reinterpret_cast<byte*>(malloc(amountOfDataToRead));

    DWORD bytesRead = 0;
    ReadFile(hInput, buffer, amountOfDataToRead, &bytesRead, NULL);

    //Perform operation on data

    free(buffer);
    CloseHandle(hInput);

}

参见上文:bytesRead 是一个双字型。我敢打赌我的输入 long long 只会被读为 long。

windows winapi visual-c++
1个回答
0
投票

框架挑战:你为什么要读取这么大的文件?考虑使用

CreateFileMapping
/
MapViewOfFile
进行内存映射。

此外,您可以在循环中调用

ReadFile
- 并不是您需要的,因为 3.1 GiB 文件完全在 32 位无符号整数的范围内。

© www.soinside.com 2019 - 2024. All rights reserved.