【问题标题】:ReadFile Crash in C++C++ 中的读取文件崩溃
【发布时间】:2011-06-29 19:44:30
【问题描述】:

我有一个非常奇怪的问题。我一直在使用 ReadFile() 从通过 USB 连接到 PC 的设备读取数据。由于要读取的数据是以 64 字节的块接收的,因此始终调用 ReadFile() 以读取 64 字节。但是,当我必须读取小于 64 字节的帧时,偶尔会发生崩溃。

我将举一个编写代码的例子:

//Memory allocation done to read 100 bytes from device - This value is known in prior and hence memory is allocated exactly
new(100bytes);
// First read of 64 bytes
ReadFile(64)
// Second read of 64 bytes 
ReadFile(64)

-> 这里从设备发送的数据只有 100-64 = 36。因此,即使我说读取 64 字节,也不会有数据大于 36 字节的情况。因此,这段代码应该可以工作(尽管我知道分配更少的内存并调用 ReadFile 以获得大于内存分配的大小是不正确的)。

问题:如果数据读取的字节数多于内存分配完成的字节数,ReadFile() 会崩溃(尽管我们知道我需要读取的数据的确切大小是多少)

PS:这种实现的原因是开发的代码设计中的一个小缺陷。

【问题讨论】:

  • 你是在异步模式下打开的吗? ReadFile 主要用于从文件(或设备)同步读取数据(它也支持异步模式)。如果您在异步模式下工作,我建议您使用 ReadFilEx

标签: c++ readfile


【解决方案1】:

完全有可能。不要对 API 撒谎,你不知道它们是如何工作的,或者如果你知道它们可以改变。这是重点的一部分。您没有说它是如何崩溃的,但可能是访问冲突。我不确定为什么,但我可以推测一种可能性。也许 ReadFile 读入一个中间缓冲区(或多个缓冲区)而不是直接读入您的缓冲区(有很多原因可能会这样做),然后在可能的情况下将 dword 大小的副本返回到您的缓冲区中。它仍然会返回正确的读取字节数,但最终可能会将一些“额外”复制到您的缓冲区中。只要您告诉 ReadFile 缓冲区的正确大小就可以了。

说实话。

【讨论】:

    【解决方案2】:

    好吧,我怀疑只是调用ReadFile 会使程序崩溃。假设是 Windows 的 Readfile 函数,让我引用documentation

    如果 ReadFile 函数试图读取文件末尾之后,该函数返回零,GetLastError 返回 ERROR_HANDLE_EOF。

    您是在处理这个错误还是在不检查的情况下继续?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多