0

我从 Win32 API 收到了两个关于 ReadFile 函数的问题。首先,鉴于

BOOL WINAPI ReadFile(
                       _In_         HANDLE hFile,
                       _Out_        LPVOID lpBuffer,
                       _In_         DWORD nNumberOfBytesToRead,
                       _Out_opt_    LPDWORD lpNumberOfBytesRead,
                       _Inout_opt_  LPOVERLAPPED lpOverlapped
                    );

第三个和第四个参数是DWORD类型,最多可以容纳1^32而不会溢出。这是否意味着 ReadFile 一次只能读取少于 1^32 字节数据的文件?如果这是真的,我想读取一个大于 1^32 的文件,我会将 ReadFile 放在这样的循环中

char buffer[1<<32];
while(!EOF){
  ReadFIle(filename,buffer,1^32,bytesout,NULL);
  SomeFunctionToExtractDataFromBuffer(buffer)
}

假设循环倾向于在每次迭代时覆盖缓冲区,为了使这种设计工作,ReadFile 需要记住文件中先前读取发生的位置,这是真的吗?或者还有其他方法可以实现这一点。非常感谢

4

1 回答 1

3

第三个和第四个参数是 DWORD 类型,最大可以容纳 1^32 不溢出。这是否意味着 ReadFile 一次只能读取少于 1^32 字节数据的文件?

不,这意味着它一次最多只能读取 2^32 个字节。没有人阻止您ReadFile多次调用以读取任意数量的字节(每次读取都会使文件指针前进,因此它将从前一次读取停止的点开始读取)。

假设循环倾向于在每次迭代时覆盖缓冲区,为了使这种设计工作,ReadFile 需要记住文件中先前读取发生的位置,这是真的吗?

是的,操作系统会为每个打开的文件记住这一点(参见上面的文件指针链接)。

在这个主题上,我应该提到,如果您正在安排 4GB 读取,那么您很可能做错了什么。无论您的数据的性质是什么,您肯定可以以更小的块处理它,这将有助于避免遇到各种问题,例如可用内存。

于 2012-09-29T18:04:16.960 回答