Из файла в файл

Тема в разделе "WASM.BEGINNERS", создана пользователем Luna, 5 ноя 2010.

  1. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Может быть вопрос и простой, но всё-равно спрошу.
    Мне надо перенести информацию из 1-го файла во 2-й. Я написала код, перед эти логически всё обдумав.

    Код (Text):
    1. ud:
    2.      
    3.      mov ah,3fh   ;chitaem zapis iz 1-go file
    4.      mov bx,desc
    5.      lea dx,sportsmen1
    6.      mov cx,type sportsmen
    7.      int 21h
    8.    
    9.      mov ah,40h  ;zapisali vo 2-i file
    10.      mov bx,desc2
    11.      int 21h
    12.  
    13. loop ud
    В результате при запуске программы я ввожу в 1-й файл 3 строки. И вместо того, чтобы перенести все эти 3 строки в другой файл, компилятор копирует во 2-й файл лишь только 3-ю последнюю строчку в бесконечно большом количестве.. Что не так? Как нужно исправить программу?)
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Luna
    0) push cx после ud:
    1) jc после вызова 3f и 40 функций
    2) mov cx, ax после вызова 3f функции
    3) pop cx перед loop ud

    вроде бы все
     
  3. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Luna Используйте отладчик TD
     
  4. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    max7C4
    хех...уже лучше )
    благодаря pop и push последняя строка печатается теперь всего лишь 2 раза.... ^__^ ) а остальное на программу не влияет
    спасибо за помощь )))

    JCronuz
    не, у меня всё вручную, по старинке)
     
  5. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Luna
    а можно примеры файлов и весь исходник. за частую глюки в одном месте начинаются из-за ошибок в третьем месте.
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Luna
    Вручную - это как раз с отладчиком - там ручками можно шагать по командам и глазками видеть что где происходит, а без него это "завязал глаза и пальцем в небо" ;) И "по старинности" TD тоже не занимать :))
     
  7. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Y_Mur
    о полностью с вами согласна)))

    max7C4
    Конечно, весь исходник здесь) правда немного неловко из-за его неопрятного вида- он ещё в процессе разработки ))

    Код (Text):
    1. DSEG SEGMENT
    2. ; ishodnie dannie- nachalo
    3.   filename db 'myfile.dat',0
    4.   filename2 db 'myfile2.dat',0
    5.  
    6. filename3 db 'myfile3.dat',0
    7. desc3 dw ?
    8.   desc dw ?
    9.   desc2 dw ?
    10.   Text db 'vvedite 2 simvola-nomer, 10 simvolov-familiuy,10 simvolov-kvalifikaciuy,5 ocenok',10,13,'$'
    11.   TEXT1 DB 'VIBERITE PUNKT MENU',10,13,'$'
    12.   TEXT2 DB 'ERROR',10,13,'$'
    13.   Text5 db 'sportsmeni,kotorie v poslednih 5 sorevnovaniayh zanayli mesta ne nizche 3-go:',10,13,'$'
    14.   Text6 db 'takih sportsmenov net!',10,13,'$'
    15.   Text7 db 'vvedite nomer sportsmena dlay udaleniay',10,13,'$'
    16.   Text8 db 'VIHOD',10,13,'$'
    17.   Text9 db 'zapis udalena',10,13,'$'
    18.  
    19.   SPORTSMEN STRUC
    20.    NOM db 2 DUP(?)
    21.    FAM db 10 DUP(?)
    22.    kval db 10 DUP(?)
    23.    MESTO db 5 DUP('  ')
    24.   SPORTSMEN ENDS
    25.   SPORTSMEN1 SPORTSMEN ?
    26.  
    27. MENU DB '  MENU:  ',10,13
    28.   DB '1-VVOD',10,13
    29.   DB '2-PECHAT TABLICI',10,13
    30.   DB '3-RESCHENIE ZADACHI',10,13
    31.   DB '4-UDALENIE',10,13
    32.   DB '5-VIHOD',10,13,'$'
    33.  
    34. ZAGOL db 41 dup('_'),10,13
    35.     db '|  |          |          |    MESTA     |',10,13
    36.     db '|N |   FAM    |   KVAL   |',14 dup('_'),'|',10,13
    37.     db '|  |',10 dup (' '),'|',10 dup(' '),'| 1| 2| 3| 4| 5|',10,13
    38.     db 41 dup ('_'),10,13,'$'
    39.  
    40.  
    41.   ZZ DB '*'
    42.  
    43.   STROKA DB  '|'
    44.   NUM DB '  '
    45.       db '|'
    46.   FAM1   db '          |'
    47.   kval1 db 10 dup (' ')
    48.        db 5 dup ('|  ')
    49.        db '|',10,13
    50.        db 41 dup ('-'),10,13,'$'
    51.  
    52.   STROKA2 DB '|'
    53.   NUM2 DB '  '
    54.       db '|'
    55.   FAM2 db '          |'
    56.    kval2 db 10 dup (' ')
    57.        db 5 dup ('|  ')
    58.        db '|',10,13
    59.        db 41 dup ('-'),10,13,'$'
    60.  
    61.  n dw ?  
    62.  
    63.   SPT SPORTSMEN 10 DUP (?)  
    64.   User_String db 34,35 dup (?)
    65.  
    66.   Text10 db 'Stroka slischkom dlinnay',10,13,'$'
    67.   Text20 db 'Chislo vne dopustimogo diapazona',10,13,'$'
    68.   Text30 db 'Nedopustimii simvol - '
    69.   Symv db ' ',10,13,'$'
    70.   Text40 db 'Povtorite vvod',10,13,'$'
    71.   New_Line db 10,13,'$'
    72.   Ish db 'Ishodnie dannie: ',10,13,'$'
    73.   Buffer db 6 dup (?),'$'
    74.   Otw db 'Rezultat : ',10,13,'$'
    75.   Pr1 db '  $'
    76. DSEG ENDS
    77.  
    78. Stacks segment
    79.   dw 100 dup (?)
    80. Stacks ends
    81.  
    82. Codes segment
    83.   MAIN PROC far
    84.     Assume CS:codes, DS:dseg, SS:stacks, ES:DSEG
    85.     Mov AX,DSEG
    86.     Mov DS,AX
    87.     mov ES,AX
    88.     CLD
    89.    
    90.     mov ah,3ch ;sozdadim file
    91.     mov cx,0
    92.     mov dx,offset filename
    93.     int 21h
    94.     mov desc,ax
    95.    
    96.  
    97.  
    98.      mov ah,3ch   ;sozdaiom 2-i file
    99.      mov cx,0
    100.      mov dx,offset filename2
    101.      int 21h
    102.      mov desc2,ax
    103.  
    104.  
    105.  
    106.  
    107.  
    108.      mov ah,3ch   ;sozdaiom 3-i file
    109.      mov cx,0
    110.      mov dx,offset filename3
    111.      int 21h
    112.      mov desc3,ax
    113.  
    114.  
    115.  
    116.    
    117.  MM:lea dx,MENU
    118.     call prt
    119.    
    120.      lea dx,text1
    121.      call prt
    122.      call Read_Keys
    123.      call nl
    124.  
    125.     MOV BX,DX
    126.     CMP  BYTE PTR [BX],'1'
    127.     JE VVOD
    128.  
    129.     CMP  BYTE PTR [BX],'2'
    130.     JE PECH
    131.    
    132.     CMP  BYTE PTR [BX],'3'
    133.     JE RR1
    134.  
    135.     CMP  BYTE PTR [BX],'4'
    136.     JE udal1
    137.  
    138.     CMP  BYTE PTR [BX],'5'
    139.     JE fin11
    140.    
    141.  
    142.      lea dx,text2
    143.      call prt
    144.      call Read_Keys
    145.      call nl
    146.  
    147.      JMP MM
    148.  
    149.  
    150. RR1:    mov ah,3dh  ;otkrili file dlay chteniay i zapisi
    151.         mov al,2
    152.         lea dx,filename
    153.         int 21h
    154.         mov desc,ax
    155.         mov cx,n
    156.         JMP RR2  
    157.  
    158.  
    159.  
    160. vvod:
    161.      
    162.      
    163.      lea dx,text
    164.      call prt
    165.      call Read_Keys
    166.      call nl
    167.      mov cx,type sportsmen ;v cx zapis-ay dlina zapisi sportsmen v baitah
    168.      
    169.    
    170.      MOV BX, DX
    171.      CMP BYTE PTR [BX], '*'
    172.      
    173.      je qqq
    174.      mov ah,40h  ;vvedennaay stroka zapis-ay v file
    175.      mov bx,desc
    176.      int 21h
    177.      jmp vvod
    178.      
    179.      
    180. qqq: mov ah,3eh  ;zakrili file
    181.      mov bx,desc
    182.      int 21h
    183.      JMP MM
    184.  
    185. FIN11: jmp fin
    186.  
    187. udal1: jmp udal
    188.  
    189. PECH:mov ah,3dh ;otkrili file dlay chteniay i zapisi
    190.      mov al,2
    191.      mov dx,offset filename
    192.      int 21h
    193.      mov desc,ax
    194.      lea dx,zagol
    195.      call prt
    196.      
    197.      mov n,0
    198. pp1:
    199.      mov ah,3fh   ;chitaem zapis iz file
    200.      mov bx,desc
    201.      lea dx,sportsmen1
    202.      mov cx,type sportsmen
    203.      int 21h
    204.      cmp ax,0
    205.      je kon
    206.      inc n
    207. printzap:
    208.          lea di,num
    209.          lea si,sportsmen1
    210.          mov cx,2
    211.          rep movsb
    212.          lea di,fam1
    213.          mov cx,10
    214.          rep movsb
    215.          lea di,kval1
    216.          mov cx,10
    217.          rep movsb
    218.          mov cx,5
    219. printm:  mov ax,[si]
    220.          inc di
    221.          mov [di],ax
    222.          add di,2
    223.          add si,2
    224.          loop printm
    225.          
    226.          lea dx,stroka
    227.          call prt
    228.          jmp pp1
    229.  
    230. kon:     mov ah,3eh ;zakrili file
    231.          mov bx,desc
    232.          int 21h
    233.          JMP MM
    234.        
    235.  
    236. MMM: JMP MM
    237.  
    238.  
    239. RR2:   lea dx,Text5
    240.         call prt
    241.  
    242. ls:     push cx
    243.         mov ah,3fh ;chitaem zapis iz file
    244.         mov bx,desc
    245.         mov cx,type sportsmen
    246.        
    247.         lea dx,sportsmen1
    248.         lea si,sportsmen1
    249.         int 21h
    250.        
    251.         mov cx,3
    252.         add si,26
    253. poisk: mov ax,[si]
    254.        cmp ax,3130h
    255.        je yes
    256.        cmp ax,3230h
    257.        je yes
    258.        cmp ax,3330h
    259.        je yes
    260.        
    261.        jmp next
    262.        
    263. yes:  
    264.          
    265.  
    266.  
    267.  
    268.        add si,2
    269.        loop poisk
    270.        cmp dx,0
    271.        jnz i
    272.        pop cx
    273.        loop ls
    274.        jmp fin2
    275.  
    276.  
    277.  
    278.  
    279.  
    280.  
    281. i:       lea di,num2
    282.          lea si,sportsmen1
    283.          mov cx,2
    284.          rep movsb
    285.          lea di,fam2
    286.          mov cx,10
    287.          rep movsb
    288.          lea di,kval2
    289.          mov cx,10
    290.          rep movsb
    291.          mov cx,5
    292. printm1:  mov ax,[si]
    293.          inc di
    294.          mov [di],ax
    295.          add di,2
    296.          add si,2
    297.          loop printm1
    298.          lea dx,stroka2
    299.          call prt
    300.        
    301. next:    pop cx
    302.          loop ls
    303.  
    304.    
    305.      
    306.  
    307.  
    308.  
    309.  
    310.  
    311. jmp mm
    312.  
    313.  
    314.  
    315. UDAL:
    316.  
    317.      lea dx,Text7
    318.      call prt
    319.      
    320.      call Read_Keys
    321.      call nl
    322.  
    323.      mov bx,dx
    324.      mov si,[bx]
    325.      
    326.      
    327. ud:
    328.      push cx
    329.      
    330.      mov ah,3fh   ;chitaem zapis iz 1-go file
    331.      
    332.      mov cx, ax
    333.  
    334.      mov bx,desc
    335.      lea dx,sportsmen1
    336.      mov cx,type sportsmen
    337.      int 21h
    338.      
    339.  
    340.      mov bx,dx
    341.      cmp si,[bx]
    342.      je ud
    343.  
    344.      
    345.      mov ah,40h  ;zapisali vo 2-i file
    346.      mov bx,desc2
    347.      int 21h
    348.    
    349.      pop cx
    350.  
    351. loop ud
    352.  
    353.  
    354.  
    355.  
    356.  
    357.  
    358.  
    359. ud2: push cx
    360.  
    361.      mov ah,3fh   ;chitaem zapis iz 2-go file
    362.      
    363.      mov cx,ax
    364.  
    365.      mov bx,desc2
    366.      lea dx,sportsmen1
    367.      mov cx,type sportsmen
    368.      int 21h
    369.      
    370.  
    371.      mov ah,40h  ;zapisali v 1-i file
    372.      mov bx,desc
    373.      int 21h
    374.      
    375.      pop cx
    376.  
    377.  
    378.  
    379.      lea dx,Text9
    380.      call PRT
    381.  
    382. konn:
    383.      jmp PECHw
    384.      
    385.  
    386.  
    387. aaa:     mov ah,3eh
    388.          mov bx,desc
    389.          int 21h
    390.          mov ah,3eh
    391.          mov bx,desc2
    392.          int 21h
    393.  
    394.  
    395.  
    396.  
    397. PECHw:mov ah,3dh ;otkrili file dlay chteniay i zapisi
    398.      mov al,2
    399.      mov dx,offset filename
    400.      int 21h
    401.      mov desc,ax
    402.      lea dx,zagol
    403.      call prt
    404.      
    405.      mov n,0
    406. pp11:
    407.      mov ah,3fh   ;chitaem zapis iz file
    408.      mov bx,desc
    409.      lea dx,sportsmen1
    410.      mov cx,type sportsmen
    411.      int 21h
    412.      cmp ax,0
    413.      je kon1
    414.      inc n
    415. printzap1:
    416.          lea di,num
    417.          lea si,sportsmen1
    418.          mov cx,2
    419.          rep movsb
    420.          lea di,fam1
    421.          mov cx,10
    422.          rep movsb
    423.          lea di,kval1
    424.          mov cx,10
    425.          rep movsb
    426.          mov cx,5
    427. printm11:  mov ax,[si]
    428.          inc di
    429.          mov [di],ax
    430.          add di,2
    431.          add si,2
    432.          loop printm11
    433.          
    434.          lea dx,stroka
    435.          call prt
    436.          jmp pp11
    437.  
    438. kon1:     mov ah,3eh ;zakrili file
    439.          mov bx,desc
    440.          int 21h
    441.          JMP MM
    442.        
    443.  
    444.  
    445.  
    446.  
    447.  
    448. fin2:cmp bx,10
    449.      je w
    450.      lea dx,Text6
    451.      call PRT
    452. w:   JMP MM
    453.  
    454.  
    455.  
    456.  
    457. FIN:
    458.      lea dx,Text8
    459.      call prt
    460.      mov ah,1
    461.      int 21h
    462.      Mov AH,4CH
    463.      Int 21h
    464.    
    465.     ; individualnaay chast programmi- konec
    466.   MAIN ENDP
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Luna
    mov cx, ax надо было добавлять после int 21h, а не после mov ah, 3fh
    функция 3fh в ax возвращает сколько на самом деле она считала байт из файла. смысла писать больше нету, поэтому можно просто записать это значение в cx
    и перед ud: стоит в cx записать количество строк.
     
  9. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    max7C4
    спасибо тебе большое)))
    некоторые ошибки я нашла, среди них- постоянное и обязательно закрытие и открытие файла, уменьшение количества записей при удалении и т.д.

    только вот mov ax,cx -никак на программу не влияла


    У меня ещё такой вопрос. Я удаляю элемент из 1-го файла путём копирования всего содержимого, кроме удаляемого элемента, во 2-й файл....ну и путём обратного копирования из 2-го в 1-й.. Почему в одну сторону у меня всё проходит отлично, а при копировании обратно в 1-й файл..удалённый элемент не записывается, зато дублируется один из оставшихся...Может, 1-й файл надо было как-нибудь очистить или заново создать?
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    нет. у вас в цикле при нахождении удаляемого элемента происходит переход к следующей итерации цикла без уменьшения счетчика, а при последнем неудачном считывании из файла т.к. из файла считалось реально 0 байт(и в ax вернулся 0), а вы не изменили количество записываемых байт на количество реально считанных (mov cx, ax), то в файл будет записано содержимое буфера (предыдущая запись, т.к. размеры их равны)

    Это комплексная логическая ошибка в алгоритме. Ее не так просто заметить при реализации, но
    Код (Text):
    1.    cx=count
    2. lp:
    3.    bytes_to_read=sizeof record
    4.    read_file
    5.    compare_buffers
    6.    jz lp
    7.    bytes_to_write=sizeof record
    8.    write_file
    9.    loop lp
    как раз допускает подобную ошибку и хотя для устранения видимого эффекта достаточно написать так
    Код (Text):
    1.    cx=count
    2. lp:
    3.    bytes_to_read=sizeof record
    4.    read_file
    5.    compare_buffers
    6.    jz lp
    7.    bytes_to_write=bytes_readed
    8.    write_file
    9.    loop lp
    но полностью ее исправлять лучше так (так верно описывать циклы)
    Код (Text):
    1.    cx=count
    2. lp:
    3.    bytes_to_read=sizeof record
    4.    read_file
    5.    compare_buffers
    6.    jz no
    7.    if bytes_readed=0 jmp ex
    8.    bytes_to_write=bytes_readed
    9.    write_file
    10. no:
    11.    loop lp
    12. ex:
     
  11. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    max7C4
    да этот вариант программы у меня уже устарел, поисправляла я там многое)
    ладно, попробую вдуматься в вами написанное и дальше поэкспериментировать)
    спасиб =)
     
  12. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Я извиняюсь, но просто моя проблема уменьшилась наполовину, и возникли новые вопросы)
    Программа отлично работает в одну сторону, т.е. она переписывает все элеиенты. кроме удаляемого, во 2-й файл.
    ....но вот при переписи из 2-го файла в 1-м оказывается один лишний дублированный элемент. Причём. если попробовать переписать элементы из 2-го файла в какой-то новосозданный 3-й(в котором раньше не было записей), то всё нормально

    Вся проблема в том, что в 1-м файле уже были записи. Пробовала заново создавать 1-й файл, но программа зацикливалась.
    Не понимаю, как исправить ошибку?


    Код (Text):
    1. UDAL:
    2.  
    3.      lea dx,Text7
    4.      call prt
    5.      
    6.      call Read_Keys
    7.      call nl
    8.  
    9.      mov bx,dx
    10.      mov si,[bx]
    11.      
    12.  
    13.  
    14.  
    15.  
    16.    
    17. mov ah,3dh  ;otkrili file dlay chteniay i zapisi
    18.         mov al,2
    19.         lea dx,filename
    20.         int 21h
    21.         mov desc,ax
    22.         mov cx,n
    23.        
    24.  
    25.  
    26. mov ah,3dh  ;otkrili file2 dlay chteniay i zapisi
    27.         mov al,2
    28.         lea dx,filename2
    29.         int 21h
    30.         mov desc2,ax
    31.         mov cx,n
    32.        
    33.  
    34.  
    35.  
    36.  
    37.  
    38. ud:
    39.      push cx
    40.      
    41.      mov ah,3fh   ;chitaem zapis iz 1-go file
    42.      
    43.      mov bx,desc
    44.      lea dx,sportsmen1
    45.      mov cx,type sportsmen
    46.      int 21h
    47.      
    48.  
    49.      mov bx,dx
    50.      cmp si,[bx]
    51.      je tt
    52.  
    53.      
    54.      mov ah,40h  ;zapisali vo 2-i file
    55.      mov bx,desc2
    56.      int 21h
    57.    jmp tt1
    58.    
    59.   tt:dec n
    60.      
    61.  
    62. tt1:   pop cx
    63.  
    64. loop ud
    65.  
    66.  
    67.  
    68.  
    69.  
    70.  
    71.          mov ah,3eh
    72.          mov bx,desc
    73.          int 21h
    74.          mov ah,3eh
    75.          mov bx,desc2
    76.          int 21h
    77.  
    78.  
    79.      mov cx,n
    80.  
    81.      mov ax,n
    82. call prn
    83.  
    84.  
    85.  
    86.  
    87.  
    88.  
    89. mov ah,3dh  ;otkrili file dlay chteniay i zapisi
    90.         mov al,2
    91.         lea dx,filename
    92.         int 21h
    93.         mov desc,ax
    94.  
    95. mov ah,3dh  ;otkrili file2 dlay chteniay i zapisi
    96.         mov al,2
    97.         lea dx,filename2
    98.         int 21h
    99.         mov desc2,ax
    100.  
    101.  
    102.  
    103.  
    104.  
    105.  
    106.  
    107. ud2: push cx
    108.  
    109.      mov ah,3fh   ;chitaem zapis iz 2-go file
    110.      
    111.  
    112.      mov bx,desc2
    113.      lea dx,sportsmen1
    114.      mov cx,type sportsmen
    115.      int 21h
    116.      
    117.  
    118.      mov ah,40h  ;zapisali v 1-i file
    119.      mov bx,desc
    120.      int 21h
    121.      
    122.      pop cx
    123. loop ud2
    124.  
    125.  
    126.  
    127.  
    128.  
    129. aaa:     mov ah,3eh
    130.          mov bx,desc
    131.          int 21h
    132.          mov ah,3eh
    133.          mov bx,desc2
    134.          int 21h
     
  13. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    перед ud2 нужна команда mov cx, n либо так
    Код (Text):
    1. ud2: push cx
    2.  
    3.      mov ah,3fh   ;chitaem zapis iz 2-go file
    4.      
    5.  
    6.      mov bx,desc2
    7.      lea dx,sportsmen1
    8.      mov cx,type sportsmen
    9.      int 21h
    10.      test ax, ax ; если ничего не считано, то выйти т.к. конец 2-го файла
    11.      jz ud2e
    12.  
    13.      mov ah,40h  ;zapisali v 1-i file
    14.      mov bx,desc
    15.      int 21h
    16.      
    17.      pop cx
    18. jmp ud2 ; повторять до посинения
    19. ud2e:
     
  14. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Последняя строчка содержит ответ. Запись в файл изменяет его содержимое, но не длину (если он не удлинняется, естественно). В описании сервиса int21/40 сказано, что при записи 0 байт файл сокращается/удлинняется до текущей позиции.