2011-06-29 50 views
0

我有一個很奇怪的問題。我一直使用ReadFile()從通過USB連接到PC的設備讀取數據。由於要讀取的數據是以64字節爲單位接收的,因此總是以64字節讀取ReadFile()。但是,當我必須讀取小於64字節的幀時,偶爾會發生崩潰。C++中的ReadFile崩潰

我給寫的代碼的一個例子:

//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的讀字節,那麼數據大於36bytes就不會出現這種情況。因此,此代碼應該工作(雖然我知道分配較少的內存並調用ReadFile的大小超過內存分配是不正確的)。

問:莫非ReadFile的()崩潰,如果數據讀取超過內存分配更多的字節是木已成舟(雖然我們知道什麼是我需要讀取數據的確切大小)

PS:之所以會出現這樣一種的一個實現是在開發的代碼設計中的一個小缺陷。

+0

您是否以異步模式打開它? ReadFile主要用於從文件(或設備)同步讀取數據(它也支持異步模式)。如果你在異步模式下工作,我建議你使用ReadFilEx – sarat

回答

0

嗯,我懷疑,只是ReadFile的電話會導致程序崩潰。假設在Windows READFILE功能,讓我引述documentation

如果ReadFile函數試圖讀到文件的末尾,該函數返回零,並GetLastError返回ERROR_HANDLE_EOF。

你處理這個錯誤還是繼續不檢查?

1

完全有可能。不要對API撒謊,你不知道它們是如何工作的,或者你是否可以改變。這是關鍵的一部分。你不會說它是如何崩潰的,但可能是訪問衝突。我不知道爲什麼,但我可以推測一種可能性。也許ReadFile讀入一箇中間緩衝區(或多個緩衝區)而不是直接寫入你的(有很多原因可以做到這一點),並在稍後將dword大小的副本放回到緩衝區。它仍然會返回正確的讀取字節數,但最終可能會將一些「額外」複製到緩衝區中。只要您告訴ReadFile緩衝區的大小正確,就可以。

說實話。