gpt4 book ai didi

c - 读取为未缓存的直接 I/O 打开的文件的最后一个 block 不会产生 EOF,正常行为?

转载 作者:行者123 更新时间:2023-12-03 20:12:15 31 4
gpt4 key购买 nike

我正在使用 CreateFile() 打开文件与旗帜 FILE_FLAG_NO_BUFFERINGFILE_FLAG_WRITE_THROUGH出于多种原因,我注意到了一种奇怪的行为:

由于要使用这些标志,我们必须分配与扇区大小对齐的内存,假设扇区大小为 512。

现在,如果我用 _aligned_malloc() 分配 512 个字节我从文件中读取,如果文件大小正好是扇区大小的倍数,那么一切正常,比如说 512*4 或 2048。我读取了 512 个字节的片段,最后一个片段是 ReadFile()返回EOF码,即返回FALSEGetLastError()设为 ERROR_HANDLE_EOF .

当文件大小与扇区大小不对齐时会出现问题,即文件大小为 2048+13 或 2061 字节。

我可以成功地从文件中读取前 4 个 512 大小的块,以及对 ReadFile() 的第 5 次调用。让我从文件中读取最新的 13 个剩余字节,但这是奇怪的事情:在这种情况下 ReadFile()不返回 EOF 代码!即使我告诉 ReadFile()读取 512 个字节,它只读取了 13 个字节(所以它超过了文件的末尾),它没有告诉我,并且只返回读取的 13 个字节,没有其他进一步的信息。

因此,当我读取最后 13 个字节并且我的循环设置为读取到 EOF 时,它将调用 ReadFile()再次第 6 次,导致错误:ERROR_INVALID_PARAMETER我想这是正确的,因为我试图在超过文件末尾后阅读!

我的问题是:这是正常行为还是我做错了什么?当使用非缓冲 I/O 时,当我读取最后一个非扇区对齐的文件块时,我应该期望没有 EOF 代码?或者有另一种方法可以做到这一点?
我怎么能理解我刚刚通过了EOF?
我想我可以通过修改循环来解决这个问题:而不是读取到 EOF,我可以读取到 EOF 或直到实际返回的字节小于读取请求的字节。这是一个正确的假设吗?

注意:使用带有普通标志的文件时不会发生这种情况,只有当我使用 FILE_FLAG_NO_BUFFERING 时才会发生这种情况。和 FILE_FLAG_WRITE_THROUGH .

注意 2:我使用 I/O 完成端口来读取文件,但我想这也发生在不使用它们的情况下,仅使用阻塞 I/O。

最佳答案

EOF 出奇的难。连C的feof函数经常被误解。

基本上,你会得到 ERROR_HANDLE_EOF在第一种情况下,要区分“读取 512 字节,更多读取”和“读取 512 字节,没有剩余”两种情况。

在秒的情况下,这不是必需的。 “请求 512 个字节,读取 13 个字节,没有错误”已经意味着您处于 EOF。部分读取的任何其他原因都是错误。

关于c - 读取为未缓存的直接 I/O 打开的文件的最后一个 block 不会产生 EOF,正常行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24157596/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com