Сбой ReadFile в C ++ - PullRequest
       6

Сбой ReadFile в C ++

0 голосов
/ 29 июня 2011

У меня очень странная проблема.Я использую ReadFile () для чтения данных с устройства, подключенного к ПК через USB.Поскольку данные для чтения принимаются кусками по 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: причиной такого рода реализации был небольшой недостаток в разработке кода, который был разработан.

Ответы [ 2 ]

1 голос
/ 29 июня 2011

Это вполне возможно. Не врите API, вы не знаете, как они работают, и если вы делаете, они могут измениться. Это часть дела. Вы не говорите, как он падает, но, возможно, это нарушение прав доступа. Я не знаю почему, но могу предположить одну возможность. Возможно, ReadFile читает в промежуточный буфер (или буферы), а не напрямую в ваш (есть ряд причин, по которым это может быть сделано), и позже, где это возможно, копии размером с dword возвращаются в ваш буфер. Он по-прежнему будет возвращать правильное количество прочитанных байтов, но может закончить копированием некоторого «лишнего» в ваш буфер. Это нормально, если вы указали ReadFile правильный размер вашего буфера.

Скажи правду.

0 голосов
/ 29 июня 2011

Ну, я сомневаюсь, что просто вызов ReadFile вызывает сбой программы. Предполагая функцию Windows Readfile, позвольте мне процитировать документацию :

Если функция ReadFile пытается прочитать после конца файла, функция возвращает ноль, а GetLastError возвращает ERROR_HANDLE_EOF.

Вы обрабатываете эту ошибку или продолжаете вообще без проверки?

...