Может быть вопрос и простой, но всё-равно спрошу. Мне надо перенести информацию из 1-го файла во 2-й. Я написала код, перед эти логически всё обдумав. Код (Text): ud: mov ah,3fh ;chitaem zapis iz 1-go file mov bx,desc lea dx,sportsmen1 mov cx,type sportsmen int 21h mov ah,40h ;zapisali vo 2-i file mov bx,desc2 int 21h loop ud В результате при запуске программы я ввожу в 1-й файл 3 строки. И вместо того, чтобы перенести все эти 3 строки в другой файл, компилятор копирует во 2-й файл лишь только 3-ю последнюю строчку в бесконечно большом количестве.. Что не так? Как нужно исправить программу?)
Luna 0) push cx после ud: 1) jc после вызова 3f и 40 функций 2) mov cx, ax после вызова 3f функции 3) pop cx перед loop ud вроде бы все
max7C4 хех...уже лучше ) благодаря pop и push последняя строка печатается теперь всего лишь 2 раза.... ^__^ ) а остальное на программу не влияет спасибо за помощь ))) JCronuz не, у меня всё вручную, по старинке)
Luna а можно примеры файлов и весь исходник. за частую глюки в одном месте начинаются из-за ошибок в третьем месте.
Luna Вручную - это как раз с отладчиком - там ручками можно шагать по командам и глазками видеть что где происходит, а без него это "завязал глаза и пальцем в небо" И "по старинности" TD тоже не занимать )
Y_Mur о полностью с вами согласна))) max7C4 Конечно, весь исходник здесь) правда немного неловко из-за его неопрятного вида- он ещё в процессе разработки )) Код (Text): DSEG SEGMENT ; ishodnie dannie- nachalo filename db 'myfile.dat',0 filename2 db 'myfile2.dat',0 filename3 db 'myfile3.dat',0 desc3 dw ? desc dw ? desc2 dw ? Text db 'vvedite 2 simvola-nomer, 10 simvolov-familiuy,10 simvolov-kvalifikaciuy,5 ocenok',10,13,'$' TEXT1 DB 'VIBERITE PUNKT MENU',10,13,'$' TEXT2 DB 'ERROR',10,13,'$' Text5 db 'sportsmeni,kotorie v poslednih 5 sorevnovaniayh zanayli mesta ne nizche 3-go:',10,13,'$' Text6 db 'takih sportsmenov net!',10,13,'$' Text7 db 'vvedite nomer sportsmena dlay udaleniay',10,13,'$' Text8 db 'VIHOD',10,13,'$' Text9 db 'zapis udalena',10,13,'$' SPORTSMEN STRUC NOM db 2 DUP(?) FAM db 10 DUP(?) kval db 10 DUP(?) MESTO db 5 DUP(' ') SPORTSMEN ENDS SPORTSMEN1 SPORTSMEN ? MENU DB ' MENU: ',10,13 DB '1-VVOD',10,13 DB '2-PECHAT TABLICI',10,13 DB '3-RESCHENIE ZADACHI',10,13 DB '4-UDALENIE',10,13 DB '5-VIHOD',10,13,'$' ZAGOL db 41 dup('_'),10,13 db '| | | | MESTA |',10,13 db '|N | FAM | KVAL |',14 dup('_'),'|',10,13 db '| |',10 dup (' '),'|',10 dup(' '),'| 1| 2| 3| 4| 5|',10,13 db 41 dup ('_'),10,13,'$' ZZ DB '*' STROKA DB '|' NUM DB ' ' db '|' FAM1 db ' |' kval1 db 10 dup (' ') db 5 dup ('| ') db '|',10,13 db 41 dup ('-'),10,13,'$' STROKA2 DB '|' NUM2 DB ' ' db '|' FAM2 db ' |' kval2 db 10 dup (' ') db 5 dup ('| ') db '|',10,13 db 41 dup ('-'),10,13,'$' n dw ? SPT SPORTSMEN 10 DUP (?) User_String db 34,35 dup (?) Text10 db 'Stroka slischkom dlinnay',10,13,'$' Text20 db 'Chislo vne dopustimogo diapazona',10,13,'$' Text30 db 'Nedopustimii simvol - ' Symv db ' ',10,13,'$' Text40 db 'Povtorite vvod',10,13,'$' New_Line db 10,13,'$' Ish db 'Ishodnie dannie: ',10,13,'$' Buffer db 6 dup (?),'$' Otw db 'Rezultat : ',10,13,'$' Pr1 db ' $' DSEG ENDS Stacks segment dw 100 dup (?) Stacks ends Codes segment MAIN PROC far Assume CS:codes, DS:dseg, SS:stacks, ES:DSEG Mov AX,DSEG Mov DS,AX mov ES,AX CLD mov ah,3ch ;sozdadim file mov cx,0 mov dx,offset filename int 21h mov desc,ax mov ah,3ch ;sozdaiom 2-i file mov cx,0 mov dx,offset filename2 int 21h mov desc2,ax mov ah,3ch ;sozdaiom 3-i file mov cx,0 mov dx,offset filename3 int 21h mov desc3,ax MM:lea dx,MENU call prt lea dx,text1 call prt call Read_Keys call nl MOV BX,DX CMP BYTE PTR [BX],'1' JE VVOD CMP BYTE PTR [BX],'2' JE PECH CMP BYTE PTR [BX],'3' JE RR1 CMP BYTE PTR [BX],'4' JE udal1 CMP BYTE PTR [BX],'5' JE fin11 lea dx,text2 call prt call Read_Keys call nl JMP MM RR1: mov ah,3dh ;otkrili file dlay chteniay i zapisi mov al,2 lea dx,filename int 21h mov desc,ax mov cx,n JMP RR2 vvod: lea dx,text call prt call Read_Keys call nl mov cx,type sportsmen ;v cx zapis-ay dlina zapisi sportsmen v baitah MOV BX, DX CMP BYTE PTR [BX], '*' je qqq mov ah,40h ;vvedennaay stroka zapis-ay v file mov bx,desc int 21h jmp vvod qqq: mov ah,3eh ;zakrili file mov bx,desc int 21h JMP MM FIN11: jmp fin udal1: jmp udal PECH:mov ah,3dh ;otkrili file dlay chteniay i zapisi mov al,2 mov dx,offset filename int 21h mov desc,ax lea dx,zagol call prt mov n,0 pp1: mov ah,3fh ;chitaem zapis iz file mov bx,desc lea dx,sportsmen1 mov cx,type sportsmen int 21h cmp ax,0 je kon inc n printzap: lea di,num lea si,sportsmen1 mov cx,2 rep movsb lea di,fam1 mov cx,10 rep movsb lea di,kval1 mov cx,10 rep movsb mov cx,5 printm: mov ax,[si] inc di mov [di],ax add di,2 add si,2 loop printm lea dx,stroka call prt jmp pp1 kon: mov ah,3eh ;zakrili file mov bx,desc int 21h JMP MM MMM: JMP MM RR2: lea dx,Text5 call prt ls: push cx mov ah,3fh ;chitaem zapis iz file mov bx,desc mov cx,type sportsmen lea dx,sportsmen1 lea si,sportsmen1 int 21h mov cx,3 add si,26 poisk: mov ax,[si] cmp ax,3130h je yes cmp ax,3230h je yes cmp ax,3330h je yes jmp next yes: add si,2 loop poisk cmp dx,0 jnz i pop cx loop ls jmp fin2 i: lea di,num2 lea si,sportsmen1 mov cx,2 rep movsb lea di,fam2 mov cx,10 rep movsb lea di,kval2 mov cx,10 rep movsb mov cx,5 printm1: mov ax,[si] inc di mov [di],ax add di,2 add si,2 loop printm1 lea dx,stroka2 call prt next: pop cx loop ls jmp mm UDAL: lea dx,Text7 call prt call Read_Keys call nl mov bx,dx mov si,[bx] ud: push cx mov ah,3fh ;chitaem zapis iz 1-go file mov cx, ax mov bx,desc lea dx,sportsmen1 mov cx,type sportsmen int 21h mov bx,dx cmp si,[bx] je ud mov ah,40h ;zapisali vo 2-i file mov bx,desc2 int 21h pop cx loop ud ud2: push cx mov ah,3fh ;chitaem zapis iz 2-go file mov cx,ax mov bx,desc2 lea dx,sportsmen1 mov cx,type sportsmen int 21h mov ah,40h ;zapisali v 1-i file mov bx,desc int 21h pop cx lea dx,Text9 call PRT konn: jmp PECHw aaa: mov ah,3eh mov bx,desc int 21h mov ah,3eh mov bx,desc2 int 21h PECHw:mov ah,3dh ;otkrili file dlay chteniay i zapisi mov al,2 mov dx,offset filename int 21h mov desc,ax lea dx,zagol call prt mov n,0 pp11: mov ah,3fh ;chitaem zapis iz file mov bx,desc lea dx,sportsmen1 mov cx,type sportsmen int 21h cmp ax,0 je kon1 inc n printzap1: lea di,num lea si,sportsmen1 mov cx,2 rep movsb lea di,fam1 mov cx,10 rep movsb lea di,kval1 mov cx,10 rep movsb mov cx,5 printm11: mov ax,[si] inc di mov [di],ax add di,2 add si,2 loop printm11 lea dx,stroka call prt jmp pp11 kon1: mov ah,3eh ;zakrili file mov bx,desc int 21h JMP MM fin2:cmp bx,10 je w lea dx,Text6 call PRT w: JMP MM FIN: lea dx,Text8 call prt mov ah,1 int 21h Mov AH,4CH Int 21h ; individualnaay chast programmi- konec MAIN ENDP
Luna mov cx, ax надо было добавлять после int 21h, а не после mov ah, 3fh функция 3fh в ax возвращает сколько на самом деле она считала байт из файла. смысла писать больше нету, поэтому можно просто записать это значение в cx и перед ud: стоит в cx записать количество строк.
max7C4 спасибо тебе большое))) некоторые ошибки я нашла, среди них- постоянное и обязательно закрытие и открытие файла, уменьшение количества записей при удалении и т.д. только вот mov ax,cx -никак на программу не влияла У меня ещё такой вопрос. Я удаляю элемент из 1-го файла путём копирования всего содержимого, кроме удаляемого элемента, во 2-й файл....ну и путём обратного копирования из 2-го в 1-й.. Почему в одну сторону у меня всё проходит отлично, а при копировании обратно в 1-й файл..удалённый элемент не записывается, зато дублируется один из оставшихся...Может, 1-й файл надо было как-нибудь очистить или заново создать?
нет. у вас в цикле при нахождении удаляемого элемента происходит переход к следующей итерации цикла без уменьшения счетчика, а при последнем неудачном считывании из файла т.к. из файла считалось реально 0 байт(и в ax вернулся 0), а вы не изменили количество записываемых байт на количество реально считанных (mov cx, ax), то в файл будет записано содержимое буфера (предыдущая запись, т.к. размеры их равны) Это комплексная логическая ошибка в алгоритме. Ее не так просто заметить при реализации, но Код (Text): cx=count lp: bytes_to_read=sizeof record read_file compare_buffers jz lp bytes_to_write=sizeof record write_file loop lp как раз допускает подобную ошибку и хотя для устранения видимого эффекта достаточно написать так Код (Text): cx=count lp: bytes_to_read=sizeof record read_file compare_buffers jz lp bytes_to_write=bytes_readed write_file loop lp но полностью ее исправлять лучше так (так верно описывать циклы) Код (Text): cx=count lp: bytes_to_read=sizeof record read_file compare_buffers jz no if bytes_readed=0 jmp ex bytes_to_write=bytes_readed write_file no: loop lp ex:
max7C4 да этот вариант программы у меня уже устарел, поисправляла я там многое) ладно, попробую вдуматься в вами написанное и дальше поэкспериментировать) спасиб =)
Я извиняюсь, но просто моя проблема уменьшилась наполовину, и возникли новые вопросы) Программа отлично работает в одну сторону, т.е. она переписывает все элеиенты. кроме удаляемого, во 2-й файл. ....но вот при переписи из 2-го файла в 1-м оказывается один лишний дублированный элемент. Причём. если попробовать переписать элементы из 2-го файла в какой-то новосозданный 3-й(в котором раньше не было записей), то всё нормально Вся проблема в том, что в 1-м файле уже были записи. Пробовала заново создавать 1-й файл, но программа зацикливалась. Не понимаю, как исправить ошибку? Код (Text): UDAL: lea dx,Text7 call prt call Read_Keys call nl mov bx,dx mov si,[bx] mov ah,3dh ;otkrili file dlay chteniay i zapisi mov al,2 lea dx,filename int 21h mov desc,ax mov cx,n mov ah,3dh ;otkrili file2 dlay chteniay i zapisi mov al,2 lea dx,filename2 int 21h mov desc2,ax mov cx,n ud: push cx mov ah,3fh ;chitaem zapis iz 1-go file mov bx,desc lea dx,sportsmen1 mov cx,type sportsmen int 21h mov bx,dx cmp si,[bx] je tt mov ah,40h ;zapisali vo 2-i file mov bx,desc2 int 21h jmp tt1 tt:dec n tt1: pop cx loop ud mov ah,3eh mov bx,desc int 21h mov ah,3eh mov bx,desc2 int 21h mov cx,n mov ax,n call prn mov ah,3dh ;otkrili file dlay chteniay i zapisi mov al,2 lea dx,filename int 21h mov desc,ax mov ah,3dh ;otkrili file2 dlay chteniay i zapisi mov al,2 lea dx,filename2 int 21h mov desc2,ax ud2: push cx mov ah,3fh ;chitaem zapis iz 2-go file mov bx,desc2 lea dx,sportsmen1 mov cx,type sportsmen int 21h mov ah,40h ;zapisali v 1-i file mov bx,desc int 21h pop cx loop ud2 aaa: mov ah,3eh mov bx,desc int 21h mov ah,3eh mov bx,desc2 int 21h
перед ud2 нужна команда mov cx, n либо так Код (Text): ud2: push cx mov ah,3fh ;chitaem zapis iz 2-go file mov bx,desc2 lea dx,sportsmen1 mov cx,type sportsmen int 21h test ax, ax ; если ничего не считано, то выйти т.к. конец 2-го файла jz ud2e mov ah,40h ;zapisali v 1-i file mov bx,desc int 21h pop cx jmp ud2 ; повторять до посинения ud2e:
Последняя строчка содержит ответ. Запись в файл изменяет его содержимое, но не длину (если он не удлинняется, естественно). В описании сервиса int21/40 сказано, что при записи 0 байт файл сокращается/удлинняется до текущей позиции.