Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
1

Определить количество символов в последней строке текстового файла

14.05.2016, 22:55. Просмотров 1059. Ответов 10

Определить количество символов в последней строке текстового файла Результат и саму строку показать на экране. Записать строку в новый файл.

Вот что я написал в итоге. Чтобы узнать последнюю строку с конца файла я двигаюсь и проверяю на конец строки 0A.
Только проблема у меня в этом самом месте. В отладчике она бесконечно в цикле двигается и не выходит. А значит не проходит сравнение, а почему я не понимаю.
Вот сам код с комментариями TASM
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
127
128
129
130
131
132
133
134
135
136
137
138
139
.386
dseg segment use16  
    text1    db 14,11,'File Open: ',0Dh,0Ah,'$'
    text2    db 13,10,'Result..: $'
    text3    db 14,11,'Next file: $'
    text4    db 13,10,'Error cr: $'
        Buf       db ? ;для изначального файла
    Buf1     db ? ; для работы внутри файла
    handle   dw ?; буфер логического номера файла
    handle2  dw ?; буфер 2 логического номера файла
    pathname db   'myfile2.asm', 0  ;    путь к файлу
    fName    db   'myfile.asm',0 ;путь ко 2 файлу ,новому
dseg ends
 
cseg segment use16
assume cs:cseg,ds:dseg
 
m1:
    mov cx,dseg
    mov ds,cx
;-------------------
;Происходит открытие файла
    mov al,0
    lea dx,fname
    mov ah,3Dh
    int 21h
    jc error  ; ошибка открытия файла (CF=1) 
 
    mov ah,09h
    lea dx,text1
    int 21h                ;вывод сообщения что файл открылся
    mov handle,ax
;--------------------
;Чтение байтов из файла
    lea dx,buf
    mov bx,handle
    mov cx,0FFh
    mov ah,3Fh
    int 21h
;--------------------
;Смещаю указатель на конец файла 
;Первый раз на -1 
    mov bx,handle
    mov al,2
    mov cx,0FFFFh
    mov dx,0FFFFh
    mov ah, 42h
    int 21h
    
    mov bx,handle
    mov cx,1
    lea dx,buf1
    mov ah, 3Fh
    int 21h
    xor bh,bh  ;счетчик сколько байтов в строке
    inc bh      
    cmp buf1,0Ah
    jne short m2 ;если сравнение не дало результата
    jmp short m3
;-----------------------------
;Теперь указатель смещаю на два и буду считывать по 1 байту.
 
    m2:
    mov bx,handle
    mov al,1
    mov cx,0FFFFh
    mov dx,0FFFEh
    mov ah, 42h
    int 21h
    
    mov bx,handle
    mov cx,1
    lea dx,buf1
    mov ah, 3Fh
    int 21h
    inc bh          
    cmp buf1,0Ah
    jne short m2 ; повторяю пока сравнение не дало результата
;---------------------------------- 
;Сравнение прошло успешно, я нашел начало последней строки
;Считываю в буфер всю строку
    m3:
    mov bx,handle
    mov cx,0FFFFh
    lea dx,buf1
    mov ah, 3Fh
    int 21h
;-----------------------------------
;Вывожу на экран результат
;Сначала количество символов а потом строку
    mov ah,0Ah
    lea dx,text2
    int 21h   
  
    mov ah,09h
    movzx dx,bh
    int 21h 
  
    mov ah,0Ah
    lea dx,Buf1
    int 21h
;-------------------------------------------------
;Создаю новый файл
    mov ah,0Ah               
    lea dx, text3 ; сообщение то что началась работа с новым файлом
    int 21h
    
    mov ah,3ch
    mov cx, 0           ;  стандартные атрибуты файла
    lea  dx, pathname
    mov ah, 3ch
    int 21h             
    jc short  error     ; ошибка создания файла (CF=1)
;-------------------------------------------------------
;Запись в новый файл
    mov handle2,ax  ;сохраняю хэндл второго файла
    mov bx,handle2
    mov cx,0
    lea dx,buf1
    mov ah,40h
    int 21h
;-------------------------------------------------------
;Закрываю файл
    mov bx,handle2
    mov ah, 3Eh
    int 21h
    jmp short m4
 
    error:
    mov   ah,09h        ; выводим на экран сообщение об ошибке
    lea   dx,text4
    int   21h
    m4:
    mov ah, 4ch         ; завершаем программу
    mov al, 00h
    int 21h
    
cseg ends
end m1
Помогите пожалуйста разобраться.
1
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2016, 22:55
Ответы с готовыми решениями:

Определить количество символов в последней строке текстового файла
Определить количество символов в последней строке текстового файла. Результат и саму строку...

Подсчитать количество символов ‘c’ и ‘d’ во введенной строке и определить, каких из символов больше
Подсчитать количество символов ‘c’ и ‘d’ во введенной строке и определить, каких из символов ‘c’...

Определить количество символов в строке
Я в ассемблере новичек, собственно, интересует вопрос как выглядит код определения количества...

Текстовые файлы: Определить количество слов в каждой строке файла
Помогите пожалуйста решить задачу: Создать текстовый файл F, строки которого содержат слова....

Определить номера первой и последней пары несовпадающих символов строки
Даны две строки из 10 символов каждая. Необходимо определить номера первой и последней пары...

10
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
14.05.2016, 23:15 2
balin, зачем ты считывал содержимое файла в буфер, если потом работаешь с самим файлом?
Алгоритм должен быть примерно таким:

1. Считать файл в буфер. Функция возвратит размер файла в AX. Запоминаем его..
2. Закрыть этот файл. Он больше не нужен. Данные уже в буфере
3. Добавить к началу буфера размер файла. Окажешься в конце файла.
4. Искать справа-налево символ 0Аh, который укажет на начало последней строки.
5. При поиске считать в СХ кол-во символов от конца строки, до символа 0Аh.
6. Скопировать СХ-символов в выходной буфер и вывести этот буфер на экран и файл
1
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
15.05.2016, 01:07  [ТС] 3
R71MT, так вроде понял
сейчас постараюсь переделать.

Добавлено через 17 минут
R71MT,
к началу буфера это будет так?
Assembler
1
2
3
mov Sizax,ax
..................
mov buf,[Sizax+buf] ;
Добавлено через 1 час 30 минут
R71MT,
Я вроде сделал по алгоритму.
Но вот большие сомнения, что я сделал правильно
1)Ошибки...
2)Я походу не понял как это записать вперед буфера
3)Зачем я копирую в выходной буфер, там же пусто, получается я вывожу только количество символов.
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
.386
dseg segment use16  
    text1    db 14,11,'File Open: ',0Dh,0Ah,'$'
    text2    db 13,10,'Result..: $'
    text3    db 14,11,'Next file: $'
    text4    db 13,10,'Error cr: $'
    Buf      db ?
    Buf1     db ?
    handle   dw ?; буфер логического номера файла
    Sizax   dw ?;
    handle2  dw ?; буфер 2 логического номера файла
    pathname db   'myfile2.asm', 0  ;    путь к файлу
    fName    db   'myfile.asm',0 ;путь ко 2 файлу ,новому
dseg ends
 
cseg segment use16
assume cs:cseg,ds:dseg
 
m1:
    mov cx,dseg
    mov ds,cx
;-------------------
;Происходит открытие файла
    mov al,0
    lea dx,fname
    mov ah,3Dh
    int 21h
    jc error  ; ошибка открытия файла (CF=1) 
 
    mov ah,09h
    lea dx,text1
    int 21h                ;вывод сообщения что файл открылся
    mov handle,ax
;--------------------
;Чтение байтов из файла
    lea dx,buf
    mov bx,handle
    mov cx,0FFh
    mov ah,3Fh
    int 21h
    mov Sizax,ax
    
;--------------------
;Закрываю файл
  mov   ah,3eh            ; Закрыть файл!
  int   21h   
;------------------------
;Добавляю к началу буфера размер файла, переношусь в конец
lea di,[Sizax+buf]
xor cx,cx
search:
dec di
inc cx       ;счетчик
cmp di,0Ah   ;ищу символ конца строки справа-налево 
jne short search
mov buf1,cx  ;копирую количество символов в буфер
 
    mov ah,0Ah
    lea dx,text2
    int 21h   
  ;вывод на экран количества символов и самой строки
    mov ah,09h
    lea dx,buf1
    int 21h 
  
 
;Создаю новый файл
    mov ah,0Ah               
    lea dx, text3 ; сообщение то что началась работа с новым файлом
    int 21h
    
    mov ah,3ch
    mov cx, 0           ;  стандартные атрибуты файла
    lea  dx, pathname
    mov ah, 3ch
    int 21h             
    jc short  error     ; ошибка создания файла (CF=1)
;-------------------------------------------------------
;Запись в новый файл
    mov handle2,ax  ;сохраняю хэндл второго файла
    mov bx,handle2
    mov cx,0
    lea dx,buf1
    mov ah,40h
    int 21h
;-------------------------------------------------------
;Закрываю файл
    mov bx,handle2
    mov ah, 3Eh
    int 21h
    jmp short m4
 
    error:
    mov   ah,09h        ; выводим на экран сообщение об ошибке
    lea   dx,text4
    int   21h
    m4:
    mov ah, 4ch         ; завершаем программу
    mov al, 00h
    int 21h
    
cseg ends
end m1
0
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
15.05.2016, 12:01 4
Лучший ответ Сообщение было отмечено balin как решение

Решение

balin, зачем дублируешь темы?
..что делает функция(0Ah) досовского сервиса (у тебя строки 58/68). Это ввод строки! А ты чё делаешь?
Вот тебе пример на 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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
;== FASM code =======================
org 100h
jmp start
 
open      db  13,10,'  File Open:  $'    ; мессаги..
last      db  13,10,'Last String:  $'    ;
size      db  13,10,'String Size:  $'    ;
create    db  13,10,'Create File:  $'    ;
ok        db  'OK! $'                    ;
err       db  'ERROR!',7,'$'             ;
 
myData    db  'myData.txt',0       ; файл с данными
myFile    db  'myFile.txt',0       ; новый файл
buff      db  2048  dup(0)         ; буфер для данных
string    db  80    dup('$')       ; буфер для строки
fSize     dw  0                    ; размер файла
 
start:
; Файл с данными ==========================================
      mov   dx,open           ;
      call  message           ;
      mov   ax,3d00h          ; Открыть!
      mov   dx,myData         ;
      int   21h               ;
      jc    error             ; ошибка?
      xchg  ax,bx             ; отправляем хэндл в ВХ
      mov   dx,ok             ; мессага OK
      call  message           ;
      mov   ah,3fh            ; Читать содержимое файла,
      mov   dx,buff           ;   ..в файловый буфер
      mov   cx,0ffffh         ;
      int   21h               ;
      mov   [fSize],ax        ; сохраняем размер файла
      mov   ah,3eh            ; Закрываем его!
      int   21h               ;
 
; Поиск последней строки в буфере =========================
      mov   dx,last           ;
      call  message           ;
      std                     ; DF=1 (читать справа-налево)
      mov   di,buff           ; где искать
      mov   cx,[fSize]        ; длина поиска
      add   di,cx             ; перемещаемся в конец буфера
      push  cx                ; запомним позицию для счётчика
      mov   al,0Ah            ; что искать
      repne scasb             ; ПУСК!
      cld                     ; нашли 0Аh (или СХ=0). сброс DF
      pop   bx                ; расчитываем длину
      sub   bx,cx             ;      ..последней строки
      xchg  cx,bx             ;
      sub   cx,2              ; (коррекция длины)
      mov   [fSize],cx        ; запомним для вывода на экран
      xchg  si,di             ; SI - источник для копирования
      add   si,2              ;
      mov   di,string         ; DI - приёмник строки
      rep   movsb             ; копируем СХ-байт из SI в DI
 
; Вывод последней строки и её размера на экран ============
      mov   dx,string         ; выводим на экран строку
      call  message           ;
      mov   dx,size           ;
      call  message           ;
      mov   ax,[fSize]        ; выводим на экран длину строки
      mov   bx,10             ;       ..в 10-тичном виде
      call  hex2asc           ;
 
; Создаём файл и отправляем в него строку =================
      mov   dx,create         ;
      call  message           ;
      mov   ah,3ch            ; Создать!
      mov   cx,20h            ;   ..c атрибутом R/W
      mov   dx,myFile         ;
      int   21h               ;
      xchg  bx,ax             ; дескриптор для записи
      mov   ah,40h            ; Запись в файл!
      mov   cx,[fSize]        ; ..байт для записи
      mov   dx,string         ; что записывать
      int   21h               ;
      mov   ah,3eh            ; Закрыть файл!
      int   21h               ;
      mov   dx,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                           ;
;------------------------------------------------------------------------
hex2asc:                 ; Функция переводит числа в символы
   pusha                 ; Вход:  АХ = число, BX = система счисления
   xor   cx,cx           ; Выход: на экране
isDiv:                   ;
   xor   dx,dx           ;
   div   bx              ;
   push  dx              ;
   inc   cx              ;
   or    ax,ax           ;
   jnz   isDiv           ;
isOut:                   ;
   pop   ax              ;
   cmp   al,9            ;
   jle   noHex           ;
   add   al,7            ;
noHex:                   ;
   add   al,30h          ;
   int   29h             ;
   loop  isOut           ;
   popa                  ;
ret                      ;
1
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
15.05.2016, 12:43  [ТС] 5
R71MT,
Спасибо.
Цитата Сообщение от R71MT Посмотреть сообщение
.что делает функция(0Ah) досовского сервиса (у тебя строки 58/68). Это ввод строки!
Я так собирался перенести на другую строчку каретку.
0
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
15.05.2016, 12:58  [ТС] 6
R71MT, Я скачал FASM, там где лежит сам FASM положил myData.txt
А он при открытии выдает ошибку.
0
Миниатюры
Определить количество символов в последней строке текстового файла  
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
15.05.2016, 13:19 7
..убери семёрку в строке.
0
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
15.05.2016, 13:26  [ТС] 8
R71MT, Блин... тоже саоме
0
Миниатюры
Определить количество символов в последней строке текстового файла  
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
15.05.2016, 14:47 9
balin, винда у тебя не 64-бит?
Вот тебе мой фасм-1.67, на котором я собирал исходник.
1
Вложения
Тип файла: zip FASM-1.67.ZIP (549.6 Кб, 5 просмотров)
balin
1 / 1 / 0
Регистрация: 10.11.2014
Сообщений: 83
15.05.2016, 15:46  [ТС] 10
R71MT, блин. у меня то как раз 64.
почитал, поискал
не нашел такой ошибки.

Добавлено через 7 минут
R71MT, ВСЕЕЕ РАБОТАЕТ
ВСёё РАЗОБРАЛСЯ!!!
СПАСИБО!
0
R71MT
5343 / 1500 / 317
Регистрация: 29.07.2014
Сообщений: 2,524
Записей в блоге: 5
15.05.2016, 16:14 11
balin, потрассируй его в отладчике и посмотри как тасуются данные в регистрах. Поймёшь принцип..
1
15.05.2016, 16:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2016, 16:14

Определить среднее количество символов в строке текстового файла
Организовать текстовый файл состоящий из N строк. Определить сред-нее количество символов в...

Определить среднее количество символов в строке данного текстового файла
4.Организовать текстовый файл состоящий из N строк. Определить среднее количество символов в строке...

Подсчитать количество символов в каждой строке текстового файла
Добрый вечер, вот такую задачу нужно реализовать, подскажите пожалуйста как ее реализовать, если...


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

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

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