Символ конца файла.

Тема в разделе "WASM.BEGINNERS", создана пользователем allex7, 14 апр 2009.

  1. allex7

    allex7 New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    20
    Здраствуйте. Программа не видит конец файла.
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. includelib \masm32\lib\kernel32.lib
    8.  
    9. .data
    10. FileName db "asm1.txt", 0
    11. MessageSize dd 20
    12. FileHandle dd ?
    13. ConsoleHandle dd ?
    14. buf db ?
    15. cW dd ?
    16.  
    17. .code
    18. Start:
    19. invoke CreateFile, ADDR FileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
    20. mov FileHandle, eax
    21. invoke GetStdHandle, STD_OUTPUT_HANDLE
    22. mov ConsoleHandle, eax
    23. mov ecx, MessageSize
    24. lp:
    25. push ecx
    26. invoke ReadFile, FileHandle, ADDR buf, 1, ADDR cW, 0
    27. invoke WriteConsole, ConsoleHandle, ADDR buf, 1, ADDR cW, 0
    28. cmp buf, 1ah
    29. je konec
    30. pop ecx
    31. loop lp
    32. konec:
    33. invoke Sleep, 5000
    34. invoke ExitProcess, 0
    35. end Start
    В файле "asm1.txt": abcd
    На экране:
    C:\masm32\_Projects\New Folder>testread
    abcddddddddddddddddd

    Подскажите пожалуйста что не так.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ReadFile не возвращает EOF-символ самостоятельно, а в файле такого нет.
     
  3. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    угу, следи за кол-вом прочтённых синволов.
     
  4. allex7

    allex7 New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    20
    Тогда подскажите как найти конец файла, чтоб выйти из цикла.
     
  5. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    [del]
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    allex7
    проверяй, когда ReadFile вернёт false
     
  7. allex7

    allex7 New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    20
    asd
    Намекните как

    MSoft
    Что значить [del]
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    При синхронном чтении ReadFile возвращает false только в случае ошибки, а при достижении конца файла возвращается true и число прочитанных байт NumberOfBytesRead = 0. Поэтому контролировать конец файла нужно по возвращаемому значению NumberOfBytesRead - в данном случае это cW, т.е. либо по cW = 0, либо по cW < числа запрошенных для чтения байт.

    Также можно сразу определить размер файла через GetFileSize и вести подсчет оставшихся для чтения байт, вычитая в цикле из размера файла число прочитанных байт cW и соотв-но выходить, когда останется 0 байт
     
  9. allex7

    allex7 New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    20
    Код (Text):
    1. cmp cW, 0
    2. je konec
    Так?
     
  10. allex7

    allex7 New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    20
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. includelib \masm32\lib\kernel32.lib
    8.  
    9. .data
    10. FileName db "asm1.txt", 0
    11. MessageSize dd 20
    12. FileHandle dd ?
    13. ConsoleHandle dd ?
    14. buf db ?
    15. cW dd ?
    16.  
    17. .code
    18. Start:
    19. invoke CreateFile, ADDR FileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
    20. mov FileHandle, eax
    21. invoke GetStdHandle, STD_OUTPUT_HANDLE
    22. mov ConsoleHandle, eax
    23. mov ecx, MessageSize
    24. lp:
    25. push ecx
    26. invoke ReadFile, FileHandle, ADDR buf, 1, ADDR cW, 0
    27. cmp cW, 0
    28. je konec
    29. invoke WriteConsole, ConsoleHandle, ADDR buf, 1, ADDR cW, 0
    30. pop ecx
    31. loop lp
    32. konec:
    33. invoke Sleep, 5000
    34. invoke ExitProcess, 0
    35. end Start
    Проверил - работает!!! Пришлось только поднять проверку так как для ReadFile и WriteConsole используется одна и таже переменная.
    Всем огромное спасибо!!!
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Можно так.
    А можно определить GetFileSize и сделать обычный цикл

    PS: Но вообще, читать из файла по одному символу - это глупость. Тем более, если файл небольшой, то проще прочитать его сразу целиком в буфер