Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Soleren
4 / 4 / 0
Регистрация: 05.05.2016
Сообщений: 15
1

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

13.05.2016, 23:14. Просмотров 897. Ответов 7
Метки нет (Все метки)

Задание у меня такое (оно же название темы):
Переписать из файла в новый файл все строки, заканчивающиеся символом "!"

Я вот понял, что у меня должен иметься файлик, в котором будет, к примеру, такой вот текст:
aaa!
bbb
ccc!
ddd

Я хотел узнать, как мне переписать строку, в которой имеется "!" в новый файл? И как его, собственно, определить, что он есть в этой строке?

Добавлено через 8 минут
Я тут уже немного начал делать (открыл файл и считал с него содержимое). Еще вопрос, где будет находиться содержимое файла после прочтения?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
.386
dseg segment use16
message1  db 23,21, 'Enter the file path: $'  
message2  db 23,21, 'This file not create $'
pathname  db 'c:\asm\81.txt', 0
text1 12, 10, 'File open $'
handle dw ?
buf db ?
dseg ends
 
cseg segment use16
assume cs:cseg,ds:dseg
m1:
    mov cx,dseg
    mov ds,cx
 
-------------!!!открытие файла!!!-----------------
    mov al, 0   
    lea dx, pathname
    mov ah, 3Dh
    int 21h
    jc short error
 
    mov   ah,9
        lea   dx,text1
        int   21h
--------------------------------------------------
    
-------------!!!чтение файла!!!-------------------
    mov bx, ax
    lea dx, buf
    mov cx, 0FFFFh
    mov ah, 3Fh
    int 21h
--------------------------------------------------
 
error:  mov   ah,9
        lea   dx,text1
        int   21h
 
    mov al, 7
    int 29h
    
end m1
cseg ends
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2016, 23:14
Ответы с готовыми решениями:

Распределить числа из исходного в файла: положительные в файл "1.dat", отрицательные в "2.dat"
помогите пожалуйста с заданием, нужно в файле найти положительные числа и записать их в файл 1.dat,...

Даны текстовый файл "F" и строка "S". Получить все строки файла "F", содержащие в качестве фрагмента строку "S".
Плиз помогите написать прогу: Даны текстовый файл "F" и строка "S". Получить все строки файла "F",...

Переписать в файл О все элементы файла К с заменой в них символа "0" на символ "1" и наоборот
Помогите создать файл К,элементы которого являются символьными. Переписать в файл О все элементы...

Переписать данные из текстового файла "a" в файл "b", при этом поменяв все символы '.' на ','
Нужно переписать данные из файла a в файл b, при этом поменяв все символы '.' на ','. While not...

Переписать в файл О все элементы файла К с заменой в них символа "0" на символ "1" и наоборот
Помогите. Нужно создать файл К,элементы которого являются символами. Переписать в файл О все...

7
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
14.05.2016, 07:21 2
Цитата Сообщение от Soleren Посмотреть сообщение
я открыл файл и считал с него содержимое..
где будет находиться содержимое файла после прочтения
..куда ты его считал, там и будет находится.

Добавлено через 5 минут
1. Тебе нужно найти в тексте символ перевода строки (0Аh)
2. Запомнить эту позицию..
3. Продолжить поиск с этого места, и найти символ(!)
4. Этот промежуток записать в буфер и отправить буфер в файл.
5. Искать сл.совпадения..
2
Soleren
4 / 4 / 0
Регистрация: 05.05.2016
Сообщений: 15
14.05.2016, 12:30  [ТС] 3
Цитата Сообщение от R71MT Посмотреть сообщение
4. Этот промежуток записать в буфер и отправить буфер в файл.
А как мне это сделать? Ну вот записать этот промежуток, а потом в файл его
2
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
14.05.2016, 13:01 4
Лучший ответ Сообщение было отмечено Soleren как решение

Решение

1. Положить в CX длину строки (обычно 80 символов)
2. Установить DI на адрес приёмного буфера
3. Установить SI на адрес строки-источника (буфер, куда считал файл)
4. Выполнить команду REP MOVSB
5. Теперь записывай в файл из приёмного буфера функцией дос 40h
2
Soleren
4 / 4 / 0
Регистрация: 05.05.2016
Сообщений: 15
14.05.2016, 17:42  [ТС] 5
хмм..

Добавлено через 22 минуты
R71MT, Посмотрите, пожалуйста, код моей программы. Не могу понять, почему не работает.
Выводит только File open и все

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
dseg segment use16
message1  db 23,21, 'Enter the file path: $'  
message2  db 23,21, 'This file not create $'
pathname  db 'c:\asm\81.txt', 0
text1 db 12, 10, 'File open $'
text2 db 15, 13, 'File create $'
text3 db 12, 10, 'File read $'
handle dw ?  ; буфер логического номера файла
buf db ?     ; буфер строки-источника
keyboard db 15 dup(?), 0 ; буффер для ввода пути с клавиатуры
dseg ends
 
eseg segment use16
PBuf db ?    ; буфер для записи строки с символом "!"
eseg ends
 
cseg segment use16
assume cs:cseg,ds:dseg, es:eseg
m1:
    mov cx,dseg
    mov ds,cx
 
;-------------!!!открытие файла!!!----------------- 
    lea dx, pathname
    mov al, 2
    mov ah, 3Dh
    int 21h
    jc short error
    mov ds:[handle], ax
 
    mov   ah,9
        lea   dx,text1
        int   21h
;--------------------------------------------------
    
;-------------!!!чтение файла!!!-------------------
    mov bx, ax
    lea dx, buf
    mov cx, 0FFFFh
    mov ah, 3Fh
    int 21h
 
    mov   ah,9
        lea   dx,text3
        int   21h
;--------------------------------------------------
 
;-------------!!!обработка файла!!!-------------------
 
    lea di, PBuf
    lea si, buf
m3: cmp si, 0Ah
    jne short m2
    inc si
    jmp short m3
 
m2: mov ss, si      ; запоминаем начало (символ переноса)
m5: inc si
    cmp si, '!'
    jne short m4
    cmp si, 0Ah
    jne short m2
    jmp short m5
 
m4: mov sp, si      ; запоминаем конец (символ '!')
    mov si, ss
m7: rep movsb
    inc di
    inc si
    cmp si, sp
    jne short m6
    jmp short m7
 
;--------------------------------------------------
 
;-------------!!!запись в файл!!!------------------
    
m6: mov   ah,9      ; выводим сообщение 'Enter the file path: $' 
        lea   dx, message1
        int   21h
    
    mov ah, 0Ah     ; считываем строку символов с клавиатуры
    lea dx, ds:[keyboard]
    int 21h
    
    mov cx, 00h
    lea dx, ds:[keyboard]   ; создаем файл
    mov ah, 3Ch
    int 21h
    jc short error
    mov ds:[handle], ax
    
    
    mov bx, ax      ; записываем в него сформированный текст
    mov cx, 10
    lea dx, Pbuf
    mov ah, 40h
    int 21h
    
;--------------------------------------------------
 
 
;-------------!!!закрытие файла!!!-------------------
    mov bx, ax
    mov ah, 3Eh
    int 21h
 
    jmp short m8
;--------------------------------------------------
    
 
error:  mov   ah,9      ; выводим на экран сообщение об ошибке
        lea   dx,text1
        int   21h
 
    mov al, 7
    int 29h
 
m8:
    mov ah, 4ch         ; завершаем программу
    mov al, 00h
    int 21h
    
 
cseg ends
end m1
1
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
14.05.2016, 18:18 6
Лучший ответ Сообщение было отмечено Soleren как решение

Решение

Смотри, что ты кладёшь в ВХ а строке(37). Там должен быть хэндл, а у тебя.. номер функции(9). Кроме этого, буфера оформлены неправильно. Нужно задавать непосредственные значение, чтоб компилятор выделял под них место. Ну и поиск, конечно-же, никуда не годный.

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


Что нужно прописывать в FASM ?
0
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
15.05.2016, 05:49 8
Лучший ответ Сообщение было отмечено Soleren как решение

Решение

Цитата Сообщение от Soleren Посмотреть сообщение
Что нужно прописывать в FASM ?
Ничё не надо там прописывать. Запускаешь FASMW.EXE (W-для винды), копируешь в окно этот код и жмёшь [F9].
1
15.05.2016, 05:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2016, 05:49

Сформируйте новый файл t2, который будет содержать те строки файла t1, которые начинаются с буквы "а" и заканчиваются буквой "я"
Задание 4. Задан текстовый файл t1. Сформируйте новый файл t2, который будет содержать те строки...

Переписать в новый файл g все строки файла f
Задан текстовый файл f и строковая переменная s. Переписать в новый файл g все строки файла f,...

Переписать в другой файл все строки в которых встречается слово "Hello"
Буду очень признателен тем ребятам, которые могут помочь мне в этом простом деле. Работа с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru