我正在学习win32编程方面的知识。 我读了参考手册(这里:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467%28v=vs.85%29.aspx)
如果lpOverlapped不为NULL,则读取操作从OVERLAPPED结构中指定的偏移量开始,并且ReadFile在读取操作完成之前不会返回。系统在ReadFile返回之前更新OVERLAPPED偏移量。
但是,如果我拨打ReadFile(hmyFile, &myrecord, sizeof(record_t), &n, &ov);
,我会看到值ov.offset
保持不变。怎么会这样?我在哪里误解了参考手册中的内容?
更多细节:
文件处理程序以hmyFile = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
打开
我没有使用FILE_FLAG_OVERLAPPED
答案 0 :(得分:1)
由于评论表明文档中存在错误。实际行为是文件指针被更新,就像lpOverlapped是NULL并且句柄是同步的一样。旧版本的文档可以做到这一点。以下内容取自2000年7月版Platform SDK文档:
ReadFile 函数从位置开始从文件中读取数据 由文件指针指示。读取操作完成后, 文件指针由实际读取的字节数调整,除非 使用重叠属性创建文件句柄。 [...]
如果未使用FILE_FLAG_OVERLAPPED打开 hFile 并且 lpOverlapped 不为NULL, 读取操作从 OVERLAPPED 结构中指定的偏移量开始。 在读取操作完成之前, ReadFile 不会返回。