C++ ReadFile FILE_FLAG_NO_缓冲如何在两个扇区之间读取数据

C++ ReadFile FILE_FLAG_NO_缓冲如何在两个扇区之间读取数据,c++,windows-xp,C++,Windows Xp,我正在使用Windows ReadFile函数按顺序读取4GB文件,并使用文件标志和无缓冲。我使用的是64K的缓冲区,一切正常,但问题是我的数据在当前缓冲区结束和下一次读取之间被剪切。例如,我有一个4字节的浮点数序列,当我到达最后一个浮点数时,当前缓冲区中只有三个字节,下一个字节将进入下一个读取缓冲区。那我怎么处理呢?我是否应该跟踪保留最后三个字节所消耗的字节数,然后在读取下一个缓冲区后追加最后一个字节?或者将缓冲区复制到另一个缓冲区,并在那里跟踪浮动?但这并没有挫败不使用Windows缓存读取

我正在使用Windows ReadFile函数按顺序读取4GB文件,并使用文件标志和无缓冲。我使用的是64K的缓冲区,一切正常,但问题是我的数据在当前缓冲区结束和下一次读取之间被剪切。例如,我有一个4字节的浮点数序列,当我到达最后一个浮点数时,当前缓冲区中只有三个字节,下一个字节将进入下一个读取缓冲区。那我怎么处理呢?我是否应该跟踪保留最后三个字节所消耗的字节数,然后在读取下一个缓冲区后追加最后一个字节?或者将缓冲区复制到另一个缓冲区,并在那里跟踪浮动?但这并没有挫败不使用Windows缓存读取的优势?谢谢您的帮助。

我认为在您处于边界的特殊情况下,您应该将上一个块中的位和下一个块中的位并排复制到一个小的暂存空间中,并从那里完整地读取它们。当您不在边界上时,您不需要使用此暂存空间。

无论如何,您必须自己进行核算,因为无缓冲读取需要对齐

但更好的问题是,为什么你认为你需要这样做?您是否尝试过使用std::ifstream读取您的文件?现代处理器和缓存在隐藏或实际上消除您可能认为缓冲I/O执行的额外拷贝方面走了很长的路

此外,如果您是按顺序读取,则文件\u标志\u否\u缓冲将禁止操作系统的预读机制。这几乎肯定会让您付出比绕过操作系统缓冲区更大的代价


我猜想您会发现,最简单的代码对大文件的顺序读取效果最好。这正是现代系统在各个级别都经过优化的情况…

感谢您的回答。我一直在读关于文件\u标志\u无\u缓冲的书,建议在读大文件时使用,比如超过1GB。在这种情况下,缓存管理器无法很好地处理缓存。事实上,我尝试了ifstream和ReadFile,并使用FILE_FLAG_SEQUENTIAL_扫描,它们的速度都慢了15%到20%,这意味着读取和处理我的文件需要一分钟左右的时间。