Вопрос № 17616: Доброе время суток, уважаемые эксперты!
Пишу прогу на асме под Винду. Нужно, чтобы она открывала файл и читала из него определёнными порциями содержимое и так, пока не закончится файл (например, invoke ReadFile, hInFile, pMemory, 500, ADDR SizeRe...
Вопрос № 17616
Доброе время суток, уважаемые эксперты!
Пишу прогу на асме под Винду. Нужно, чтобы она открывала файл и читала из него определёнными порциями содержимое и так, пока не закончится файл (например, invoke ReadFile, hInFile, pMemory, 500, ADDR SizeRet, NULL и так по циклу). А как определить, файл закончился? Сравнивать SizeRet с нулем не помогает. Помогите, plz.
Отправлен: 28.02.2005, 18:45
Вопрос задал: Gluck (статус: Посетитель)
Всего ответов отправлено: 5
Отвечает: John Freeman
Здравствуйте, Gluck!
ReadFile между прочим возвращает bytesread...
Ответ отправил: John Freeman (статус: Специалист)
Отправлен: 28.02.2005, 19:29
Отвечает: Bob Johnson
Здравствуйте, Gluck! Сравнивать лучше то, сколько функция реально прочитала байт с тем, сколько байт ее просили прочитать. Если меньше - значит достигнут конец файла или еще какая-нибудь ошибка. Можно сравнивать и с нулем, но при этом следует иметь ввиду, что вначале функция возвратит число меньше, а уже при следующем вызове - ноль (т.е. надо быть готовым к обработке ситуаций, когда не весь буфер содежить данные).
* EMan2.0: ---===*** Debug mode ***===---
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 28.02.2005, 21:46
Отвечает: AxMAD
Здравствуйте, Gluck!
Что определить можно просто сравнить SizeRet и 500, если они не равны то это последний блок...
Ответ отправил: AxMAD (статус: Студент)
Отправлен: 01.03.2005, 09:01
Отвечает: Котиев Зураб
Здравствуйте, Gluck!
Надо сравнивать с 0 еще и возвращаемое ReadFile значение.
При достижении конца файла оно не 0 ,а SizeRet=0;
repeat:
invoke ReadFile, hInFile, pMemory, 500, ADDR SizeRet, NULL
or eax,eax
jne error
cmp dword ptr [SizeRet],0
jne repeat
file_end:
error:
Ответ отправил: Котиев Зураб (статус: 2-ой класс)
Отправлен: 01.03.2005, 11:05
Отвечает: Dark_Lord
Здравствуйте, Gluck!
По идее (см. msdn, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/readfile.asp), если при вызова функции чтения из файла параметр асинхронного чтения (последний параметр) не задан, то если указатель достиг конца файла, функция вернёт 0 и GetLastError вернёт ERROR_HANDLE_EOF. То есть, если просто смотреть значение, возвращаемое ReadFile, получаем цикл (см прил.), который читает данные до тех пор, пока не кончится файл.
Приложение:
Ответ отправил: Dark_Lord (статус: Профессионал)
Отправлен: 01.03.2005, 23:57