Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/17: Рейтинг темы: голосов - 17, средняя оценка - 4.88
Virusolog
1 / 1 / 0
Регистрация: 22.11.2010
Сообщений: 32
1

Удалить строку текста из файла

22.11.2010, 14:12. Просмотров 3174. Ответов 8
Метки нет (Все метки)

Всем привет!!!

Пишу код консольной программы под DOS для работы с текстовым файлом (база данных)

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

Написал все кроме - удалить строку
Помогите, пожалуйста, как реализовать удаление строки, как это можно сделать проще?


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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
text segment 'code'
assume cs: text, ds: data
;определения
myproc proc
  mov AX, data
  mov DS, AX
  ;открыть файл БД и если его нет, то создать новый
    mov AH, 3dh
    mov AL, 2 ;не только чтение
    mov DX, offset filename
    int 21h
    jc createfile
    mov handle, ax
  body:
  ;вывод на экран строки текста приветствия
    mov AH, 40h
    mov BX, 1
    mov CX, meslen
    mov DX, offset mes
    int 21h
  ;вывод на экран строки меню
    mov AH, 40h
    mov BX, 1
    mov CX, menulen
    mov DX, offset menu
    int 21h
  ;ввод символа из меню
    again:
    mov AH, 08h
    mov bx, 0
    int 21h
    cmp AL,'1' ;сравним с цифрой на клавиатуре
    jne nextcode
    jmp createfile ;переход к созданию файла
    nextcode:
     cmp AL, '2'
     jne nextcode2
     jmp inputtext  ;ввести текст
    nextcode2:
     cmp AL, '3'
     jne nextcode3
     jmp look  ;просмотреть данные
    nextcode3:
     cmp AL, '4'
     jne nextcode4
     jmp insertstring ;вставить строку
    nextcode4:
     cmp AL, '5'
     jne nextcode5
     jmp deletestring  ;удалить строку
    nextcode5:
     cmp AL, '6'
     jne errorkey
     jmp exit  ;выход
    errorkey:
     mov AH, 40h
     mov BX, 1
     mov CX, errormsglen
     mov DX, offset errormsg
     int 21h
     jmp again
  ;##### основная функциональная часть этой программы #####
    createfile:
      mov AH, 3ch
      mov cx, 0
      mov dx, offset filename
      int 21h
      mov handle, ax
      
      ;установить указатель на начало файла
      mov AH, 42h
      mov AL, 0
      mov bx, handle
      mov cx, 0
      mov dx, 0
      int 21h
      
      mov AH, 40h
      mov bx, handle
      mov cx, columnlen
      mov dx, offset columns
      int 21h
 
      jmp body
    inputtext:
      mov AH, 3fh
      mov bx, 0
      mov cx, 1024
      mov dx, offset buffer
      int 21h
      mov actlen, ax
 
      mov AH, 40h
      mov bx, handle
      mov cx, actlen
      mov dx, offset buffer
      int 21h
      jmp again
    insertstring:
      mov AH, 42h ;установить указатель на конец файла
      mov AL, 2
      mov bx, handle
      mov cx, 0
      mov dx, 0
      int 21h
      
      mov AH, 3fh  ;ввод строки в буфер
      mov bx, 0
      mov cx, 80
      mov dx, offset buffer
      int 21h
      mov actlen, ax
 
      mov AH, 40h  ;дописать строку в файл
      mov bx, handle
      mov cx, actlen
      mov dx, offset buffer
      int 21h
      jmp again
    look:
      mov AH, 42h
      mov AL, 0
      mov bx, handle
      mov cx, 0
      mov dx, 0
      int 21h
 
      mov AH, 3Fh
      mov bx, handle
      mov cx, 1024
      mov dx, offset buffer
      int 21h
 
      mov actlen, ax
      mov ah, 40h
      mov bx, 1
      mov cx, actlen
      mov dx, offset buffer
      int 21h
      jmp again
    deletestring:
      ....
      ;
    exit:
      mov AX, 4C00h
      int 21h
myproc endp   
text ends
;данные
data segment
  mes db 'Welcome to the Teacher database!',13,10
  meslen equ $-mes
  menu db '1-Create file,2-Input text,3-Look DB,4-Insert string,5-Delete string,6-Exit',13,10
  menulen equ $-menu
  errormsg db 'Invalid key! Try another',13,10
  errormsglen equ $-errormsg
  filename db 'thbase.txt',0
  columns db 'class  student address phone',13,10
  columnlen equ $-columns
  buffer db 1024 dup(0)
  actlen dw ?
  handle dw ?
  filesize dw ?
  filelen equ $-filesize
data ends
stack segment para stack 'stack'
stack ends
end myproc
Добавлено через 26 минут
Ребят помогите пожалуйста все выходные убил чтобы удаление строки реализовать
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2010, 14:12
Ответы с готовыми решениями:

Считать строку с файла, удалить повторные символы
Чтение данных входного текстового файла Input.txt и запись в выходной файл Output.txt содержимого...

Из типизированного файла, который содержит несколько строк текста, вывести на экран монитора строку текста с определенным порядковым номером
1. Создать или открыть текстовый (типизированный, нетипизированный) файл. 2. Выполнить над...

Удалить строку из файла. Вставить строку из файла
Chao ;-) Задача: изменение файла БЕЗ СОЗДАНИЯ ДОПОЛНИТЕЛЬНОГО ФАЙЛА. Необходимо осуществить...

Удалить строку по совпадению текста
Всем привет. Возникла необходимость удалить определенную строку из текстового файла. Нашел...

Как удалить пустую строку из текста.
Здравствуйте. Подскажите, пожалуйста, если в текстовом файле есть пустая строка, как сделать, что...

8
airyashov
69 / 74 / 0
Регистрация: 15.12.2008
Сообщений: 302
22.11.2010, 14:16 2
1 промежуточный файл, пишем все до строки и все после строки, переименовываем
2 либо затирать первый символ строки нулем в фале и анализировать первый байт если ноль нет строки при др операциях, например добавление и просмотр, дополнительная программа может его жать тоже через промежуточный файл
0
Virusolog
1 / 1 / 0
Регистрация: 22.11.2010
Сообщений: 32
22.11.2010, 14:22  [ТС] 3
1-ый способ неплох

Создам промежуточный файл. А как записать все до строки и после строки, как это можно вытащить?

Пользователь вводит номер строки
А как мне эту строку найти в документе? Как скопировать все что вокруг нее в отдельный документ?
0
airyashov
69 / 74 / 0
Регистрация: 15.12.2008
Сообщений: 302
22.11.2010, 14:42 4
при данном способе сохранения лучше использовать строки определенной длины, неэффективно по размеру, но легко работать, иначе только файл парсить построчно, что у Вас конец строки перевод каретки 0dh
0
Mikl___
Автор FAQ
13381 / 6382 / 630
Регистрация: 11.11.2010
Сообщений: 11,545
22.11.2010, 14:42 5
Virusolog, пользователь ввел номер строки
если номер равен 1 тогда в первом файле ищешь символ перевода строки командой SCASB как только нашел у тебя есть длина строки, минусуешь ее из общей длины и с позиции на которую указывает DI копируешь во второй файл
если номер не равен 1, тогда копируешь во второй файл от начала файла до первого перевода строки, увеличиваешь счетчик строк, сравниваешь с требуемым числом, если не совпадает, копируешь до следующего перевода строки, если номер строки которую нужно удалить, прекращаешь копирование и ищешь конец строки, нашел конец, теперь копируешь до конца файла. Как-то так...
0
Virusolog
1 / 1 / 0
Регистрация: 22.11.2010
Сообщений: 32
22.11.2010, 14:54  [ТС] 6
Цитата Сообщение от Mikl___ Посмотреть сообщение
Virusolog, пользователь ввел номер строки
если номер равен 1 тогда в первом файле ищешь символ перевода строки командой SCASB как только нашел у тебя есть длина строки, минусуешь ее из общей длины и с позиции на которую указывает DI копируешь во второй файл
если номер не равен 1, тогда копируешь во второй файл от начала файла до первого перевода строки, увеличиваешь счетчик строк, сравниваешь с требуемым числом, если не совпадает, копируешь до следующего перевода строки, если номер строки которую нужно удалить, прекращаешь копирование и ищешь конец строки, нашел конец, теперь копируешь до конца файла. Как-то так...

ничего не понял - у меня в файл при добавлении строки вообще цифра не заносится и если например пользователь хочет удалить 5 строку???? И как вообще получить размер информации в файле??

Вот например - код добавления новой строки
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
insertstring:
      mov AH, 42h ;установить указатель на конец файла
      mov AL, 2
      mov bx, handle
      mov cx, 0
      mov dx, 0
      int 21h
      
      mov AH, 3fh  ;ввод строки в буфер
      mov bx, 0
      mov cx, 80
      mov dx, offset buffer
      int 21h
      mov actlen, ax
 
      mov AH, 40h  ;дописать строку в файл
      mov bx, handle
      mov cx, actlen
      mov dx, offset buffer
      int 21h
      jmp again
Как сделать чтобы вместе с каждой новой строкой добавлялся бы и ее номер??
0
airyashov
69 / 74 / 0
Регистрация: 15.12.2008
Сообщений: 302
22.11.2010, 16:16 7
проще писать всегда 80 символов в файл, тогда считать будет проще, буфер перед вводом обнулять
0
Virusolog
1 / 1 / 0
Регистрация: 22.11.2010
Сообщений: 32
22.11.2010, 16:45  [ТС] 8
Парни я уже запарился тут

Упрощаю задачу - так как все гениальное - просто

Как удалить последнюю введенную строку? Я бросаю затею с вводом номеров строк которые следует удалить - нужно просто удалить последнюю строку!

Как сделать чтобы при вводе все строки были одинаковой длины - 80 байт?
То есть например мы вводим школа а далее программа забивает строку до 80 байт!


Помогите, ребят, пожалуйста нужен пример кода для удаления строки (последней)!!
0
Полный 30h
Эксперт быдлокодинга
1822 / 447 / 61
Регистрация: 04.11.2010
Сообщений: 1,226
23.11.2010, 00:46 9
Цитата Сообщение от Virusolog Посмотреть сообщение
Парни я уже запарился тут

Упрощаю задачу - так как все гениальное - просто

Как удалить последнюю введенную строку? Я бросаю затею с вводом номеров строк которые следует удалить - нужно просто удалить последнюю строку!
Я не очень хорошо сам владею ассемблером, поэтому возможно сейчас и сморожу. Что если передвинуть указатель файла к его началу на кол-во символов последней строки и закрыть файл?

Добавлено через 9 минут
Цитата Сообщение от Virusolog Посмотреть сообщение
И как вообще получить размер информации в файле??
Assembler
1
2
3
4
5
6
7
8
;Файл разумеется должен уже быть открыт
;---определяем длину файла
   MOV  AH,42H           ;функция перемещения указателя
   MOV  AL,2             ;код установки на конец файла
   MOV  BX,HANDLE        ;номер файла в BX
   MOV  CX,0             ;0 в CX и DX
   MOV  DX,0             ;
   INT  21H              ;сдвигаем указатель
;в DX:AX возвращается длина файла в байтах
0
23.11.2010, 00:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.11.2010, 00:46

Удалить из текста находящегося в файле. самую длинную строку
Попытался сделать вот так, вроде самое просто задание с определением длинной строки и ее...

Удалить строку, если ее первая буква текста не является заглавной
Ребят, кто-нибудь, пожалуйста, помогите с макросом для Excel ! Вообще не понимаю, как это сделать,...

Удалить из текста все слова с удвоением букв и записать их в отдельную строку
Задано текст, слова в котором разделены пробелами и знаками препинания. Разработать программу,...


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

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

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