Здраствуйте. Программа не видит конец файла. Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib .data FileName db "asm1.txt", 0 MessageSize dd 20 FileHandle dd ? ConsoleHandle dd ? buf db ? cW dd ? .code Start: invoke CreateFile, ADDR FileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 mov FileHandle, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov ConsoleHandle, eax mov ecx, MessageSize lp: push ecx invoke ReadFile, FileHandle, ADDR buf, 1, ADDR cW, 0 invoke WriteConsole, ConsoleHandle, ADDR buf, 1, ADDR cW, 0 cmp buf, 1ah je konec pop ecx loop lp konec: invoke Sleep, 5000 invoke ExitProcess, 0 end Start В файле "asm1.txt": abcd На экране: C:\masm32\_Projects\New Folder>testread abcddddddddddddddddd Подскажите пожалуйста что не так.
При синхронном чтении ReadFile возвращает false только в случае ошибки, а при достижении конца файла возвращается true и число прочитанных байт NumberOfBytesRead = 0. Поэтому контролировать конец файла нужно по возвращаемому значению NumberOfBytesRead - в данном случае это cW, т.е. либо по cW = 0, либо по cW < числа запрошенных для чтения байт. Также можно сразу определить размер файла через GetFileSize и вести подсчет оставшихся для чтения байт, вычитая в цикле из размера файла число прочитанных байт cW и соотв-но выходить, когда останется 0 байт
Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib .data FileName db "asm1.txt", 0 MessageSize dd 20 FileHandle dd ? ConsoleHandle dd ? buf db ? cW dd ? .code Start: invoke CreateFile, ADDR FileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 mov FileHandle, eax invoke GetStdHandle, STD_OUTPUT_HANDLE mov ConsoleHandle, eax mov ecx, MessageSize lp: push ecx invoke ReadFile, FileHandle, ADDR buf, 1, ADDR cW, 0 cmp cW, 0 je konec invoke WriteConsole, ConsoleHandle, ADDR buf, 1, ADDR cW, 0 pop ecx loop lp konec: invoke Sleep, 5000 invoke ExitProcess, 0 end Start Проверил - работает!!! Пришлось только поднять проверку так как для ReadFile и WriteConsole используется одна и таже переменная. Всем огромное спасибо!!!
Можно так. А можно определить GetFileSize и сделать обычный цикл PS: Но вообще, читать из файла по одному символу - это глупость. Тем более, если файл небольшой, то проще прочитать его сразу целиком в буфер