我有两个关于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需要记住文件中先前发生读取的位置,这是真的吗?或有其他方法可以实现这一目标。非常感谢
最佳答案
第三个和第四个参数的类型为DWORD,可以容纳
最大1 ^ 32,无溢出。这是否意味着ReadFile只能
读取一次具有少于1 ^ 32字节数据的文件?
否。这意味着它一次只能读取2 ^ 32字节。没有人会阻止您多次调用ReadFile
来读取所需的总计字节(每次读取都会使file pointer前进,因此它将从上一次读取停止的位置开始读取)。
假设循环倾向于在每次迭代时覆盖缓冲区,
为了使该设计有效,ReadFile需要记住在哪里
文件中以前发生的读取是真的吗?
是的,操作系统会记住每个打开的文件(请参见上面的文件指针链接)。
在主题上,我应该提到,如果您计划4GB读取,那么您很可能做错了什么。无论数据的本质是什么,您都可以肯定地以较小的块进行处理,这将有助于避免遇到诸如可用内存等各种问题。
关于c++ - Win32 API的ReadFile函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12655120/