Переписать из файла в новый файл все строки, заканчивающиеся символом "!" - Assembler

Узнай цену своей работы

Формулировка задачи:

Задание у меня такое (оно же название темы):

Переписать из файла в новый файл все строки, заканчивающиеся символом "!"

Я вот понял, что у меня должен иметься файлик, в котором будет, к примеру, такой вот текст: aaa! bbb ccc! ddd Я хотел узнать, как мне переписать строку, в которой имеется "!" в новый файл? И как его, собственно, определить, что он есть в этой строке?
Я тут уже немного начал делать (открыл файл и считал с него содержимое). Еще вопрос, где будет находиться содержимое файла после прочтения?
Листинг программы
  1. .386
  2. dseg segment use16
  3. message1 db 23,21, 'Enter the file path: $'
  4. message2 db 23,21, 'This file not create $'
  5. pathname db 'c:\asm\81.txt', 0
  6. text1 12, 10, 'File open $'
  7. handle dw ?
  8. buf db ?
  9. dseg ends
  10. cseg segment use16
  11. assume cs:cseg,ds:dseg
  12. m1:
  13. mov cx,dseg
  14. mov ds,cx
  15. -------------!!!открытие файла!!!-----------------
  16. mov al, 0
  17. lea dx, pathname
  18. mov ah, 3Dh
  19. int 21h
  20. jc short error
  21. mov ah,9
  22. lea dx,text1
  23. int 21h
  24. --------------------------------------------------
  25. -------------!!!чтение файла!!!-------------------
  26. mov bx, ax
  27. lea dx, buf
  28. mov cx, 0FFFFh
  29. mov ah, 3Fh
  30. int 21h
  31. --------------------------------------------------
  32. error: mov ah,9
  33. lea dx,text1
  34. int 21h
  35. mov al, 7
  36. int 29h
  37. end m1
  38. cseg ends

Решение задачи: «Переписать из файла в новый файл все строки, заканчивающиеся символом "!"»

textual
Листинг программы
  1. ;== FASM code =======================
  2. org 100h
  3. jmp start
  4.  
  5. open      db  13,10,'  Open file: $'    ; мессаги..
  6. create    db  13,10,'Create file: $'    ;
  7. ok        db  'OK! $'                   ;
  8. err       db  'ERROR!',7,'$'            ;
  9.  
  10. oldFname  db  'oldFile.txt',0           ; файл с данными
  11. newFname  db  'newFile.txt',0           ; новый файл
  12. fBuff     db  80*25 dup(0)              ; буфер для данных (25 строк)
  13. newBuff   db  78*1  dup(' '),13,10      ; буфер для записи (1 строка)
  14.  
  15. fSize     dw  0               ; размер файла
  16. handle    dw  0               ;   ..и его дескриптор.
  17.  
  18. start:
  19. ; Файл с данными =====================================
  20.       mov   dx,open           ;
  21.       call  message           ;
  22.       mov   ax,3d00h          ; Открыть!
  23.       mov   dx,oldFname       ;
  24.       int   21h               ;
  25.       jc    error             ; ошибка?
  26.       xchg  ax,bx             ; отправляем хэндл в ВХ
  27.       mov   dx,ok             ; мессага OK
  28.       call  message           ;
  29.       mov   ah,3fh            ; Читать содержимое файла,
  30.       mov   dx,fBuff          ;   ..в файловый буфер
  31.       mov   cx,0ffffh         ;
  32.       int   21h               ;
  33.       mov   [fSize],ax        ; сохраняем размер файла
  34.       mov   ah,3eh            ; Закрыть файл!
  35.       int   21h               ;
  36.  
  37. ; Новый файл =========================================
  38.       mov   dx,create         ;
  39.       call  message           ;
  40.       mov   ah,3ch            ; Создать!
  41.       mov   cx,20h            ;   ..c атрибутом R/W
  42.       mov   dx,newFname       ;
  43.       int   21h               ;
  44.       mov   [handle],ax       ; сохраняем хэндл файла
  45.  
  46. ; Поиск строки =======================================
  47.       mov   di,fBuff          ; где искать
  48.       mov   al,'!'            ; что искать
  49.       mov   cx,[fSize]        ; длина поиска (размер файла)
  50. find: repne scasb             ; старт!
  51.       jcxz  stop              ; стоп - если СХ=0
  52.       push  ax di cx          ; иначе: сохраняем позицию поиска
  53.       call  writeString       ;    ..и на сравнение/запись
  54.       mov   al,' '            ; очистим пробелами,
  55.       mov   di,newBuff        ;    ..выходной буфер
  56.       mov   cx,78             ;       ..для след.строки
  57.       rep   stosb             ;
  58.       pop   cx di ax          ; возвращаем позицию
  59.       jmp   find              ;   ..и продолжаем поиск
  60.  
  61. ; Финальная стадия ====================================
  62. stop: mov   ah,3eh            ; Закрыть новый файл!
  63.       int   21h               ;
  64.       mov   dx,ok             ; мессага OK!
  65.       call  message           ;
  66.       jmp   exit              ;   ..и на выход
  67.  
  68. error:                        ; (обработчик ошибки)
  69.       mov   dx,err            ;
  70.       call  message           ;
  71. exit:                         ;
  72.       xor   ax,ax             ;
  73.       int   16h               ;
  74.       int   20h               ;
  75.  
  76. ;ннннннннннннннннн П Р О Ц Е Д У Р Ы нннннннннннннннннннннннннннннннннннн
  77. ;------------------------------------------------------------------------
  78. message:                      ;
  79.       mov   ah,9              ; вывод строки на экран
  80.       int   21h               ;
  81. ret                           ;
  82. ;------------------------------------------------------------------------
  83. writeString:                  ;
  84.       std                     ; ставим обратный шаг (флаг DF=1)
  85.       push  cx                ; запомним позицию конца (символ "!")
  86.       mov   al,0Ah            ; будем искать 0Аh (справа-налево)
  87.       repne scasb             ; поиск пока не найдём, или СХ = 0
  88.       cld                     ; ставим прямой шаг (слева-направо)
  89.       pop   bx                ; пизиция конца в ВХ, начала в СХ
  90.       sub   bx,cx             ; расчитываем длину строки,
  91.       xchg  cx,bx             ;   ..и ставим её счётчиком для копирования
  92.       sub   cx,2              ;            (коррекция счётчика)
  93.       xchg  si,di             ; SI = адрес источника
  94.       add   si,2              ;            (коррекция источника)
  95.       mov   di,newBuff        ; DI = адрес приёмника
  96.       rep   movsb             ; скопировать строку из SI в DI
  97.       mov   ah,40h      ;<----; Запись в файл!
  98.       mov   bx,[handle]       ;
  99.       mov   cx,80             ; ..байт для записи
  100.       mov   dx,newBuff        ; что записывать
  101.       int   21h               ;
  102. ret                           ;

Объяснение кода листинга программы

Код написан на ассемблере и выполняет следующие действия:

  1. Открывает старый файл с помощью функции open и выводит сообщение об успешном открытии или ошибке.
  2. Создает новый файл с помощью функции create и выводит сообщение об успешном создании или ошибке.
  3. Ищет все строки в старом файле, которые заканчиваются символом !. Для этого используется функция find, которая выполняет поиск строки, начиная с указанного места в файле, и выходит из цикла, когда достигает конца строки или когда находит строку, заканчивающуюся на !.
  4. Записывает найденные строки в новый файл с помощью функции writeString.
  5. Закрывает старый и новый файлы с помощью функций close и exit. Список переменных:
  6. oldFname - строка, содержащая имя старого файла.
  7. newFname - строка, содержащая имя нового файла.
  8. fBuff - буфер для чтения данных из старого файла.
  9. newBuff - буфер для записи данных в новый файл.
  10. fSize - переменная, содержащая размер старого файла.
  11. handle - переменная, содержащая дескриптор старого файла. Список функций:
  12. open - открывает старый файл и выводит сообщение об успешном открытии или ошибке.
  13. create - создает новый файл и выводит сообщение об успешном создании или ошибке.
  14. message - выводит сообщение на экран.
  15. find - ищет строку в файле.
  16. writeString - записывает строку в новый файл.
  17. close - закрывает старый и новый файлы.
  18. exit - завершает программу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы