Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的读取文件崩溃+;_C++_Readfile - Fatal编程技术网

C++ C+中的读取文件崩溃+;

C++ C+中的读取文件崩溃+;,c++,readfile,C++,Readfile,我有一个很奇怪的问题。我一直在使用ReadFile()从通过USB连接到PC的设备读取数据。由于要读取的数据是以64字节的数据块接收的,因此始终使用64字节来调用ReadFile()。但是,当我必须读取小于64字节的帧时,偶尔会发生崩溃 我将给出一个代码示例: //Memory allocation done to read 100 bytes from device - This value is known in prior and hence memory is allocated exa

我有一个很奇怪的问题。我一直在使用ReadFile()从通过USB连接到PC的设备读取数据。由于要读取的数据是以64字节的数据块接收的,因此始终使用64字节来调用ReadFile()。但是,当我必须读取小于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
就会导致程序崩溃。假设Windows Readfile函数,让我引用以下内容:

如果ReadFile函数试图读取超过文件末尾的内容,则该函数返回零,GetLastError返回ERROR\u HANDLE\u EOF


您是在处理此错误,还是在根本不检查的情况下继续操作?

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


说实话。

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