How to copy from one file to another?

此生再无相见时 提交于 2019-12-08 02:09:52

问题


I am trying to copy from one file to another. So if the user is prompted to enter a file name...FILE1 a saved string will be copied to a file then the user is prompted to enter a second file name...File2, the contents of file 1 is copied to file 2. I can find information on the read part but I'm not sure how to copy from 1 to the other???

.model small

.stack 100h

.data

handle      dw ? 

filename    db  26        ;MAX NUMBER OF CHARACTERS ALLOWED (25).
            db  ?         ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER).
            db  26 dup(0) ;CHARACTERS ENTERED BY USER. END WITH CHR(13).

prompt1 db "ENTER FILE NAME HERE: $" 

mess1       db ' I WIN! $'

.code

main:           
mov ax, @data       ; set up addressability of data
mov ds, ax

;DISPLAY MESSAGE.
lea dx, prompt1            ; load and print the string PROMPT
mov ah, 9
int 21h      

;CAPTURE FILENAME FROM KEYBOARD.                                    
mov ah, 0Ah
mov dx, offset filename ;THIS VARIABLE REQUIRES THE 3-DB FORMAT.
int 21h                

;CAPTURED STRING ENDS WITH CHR(13), BUT TO CREATE FILE WE NEED
;THE FILENAME TO END WITH CHR(0), SO LET'S CHANGE IT.
mov si, offset filename + 1 ;NUMBER OF CHARACTERS ENTERED.
mov cl, [ si ] ;MOVE LENGTH TO CL.
mov ch, 0      ;CLEAR CH TO USE CX. 
inc cx         ;TO REACH CHR(13).
add si, cx     ;NOW SI POINTS TO CHR(13).
mov al, 0
mov [ si ], al ;REPLACE CHR(13) BY 0.            

;CREATE FILE.
mov ah, 3ch         ; dos service to create file
mov cx, 0
mov dx, offset filename + 2 ;CHARACTERS START AT BYTE 2.
int 21h

jc failed                           ; end program if failed

mov handle, ax                      ; save file handle

mov DI, 100 ;CAN'T USE CX BECAUSE WE NEED IT TO WRITE TO FILE.
PL:
;WRITE STRING ON FILE.
mov ah, 40h                         ; write to 
mov bx, handle                      ; file
mov dx, offset mess1                ; where to find data to write
mov cx, 7 ;LENGTH OF STRING IN CX.
int 21h

DEC DI ;DECREASE COUNTER.
jnz PL

mov ah, 3Eh                         ; close file
mov bx, handle                      ; which file
int 21h

failed:





mov ah, 4ch
int 21h

end main

回答1:


Ok, Jake, I have run you code and it works great. What you need is copy-paste some parts already there, and add three : open the first file, create another, and transfer data. I modify your code to achieve the goal, here it is, copy-paste it in your compiler and let me now if it worked :

    .model small

    .stack 100h

    .data

    handle      dw ? 
    handle2     dw ? 

    filename    db  26        ;MAX NUMBER OF CHARACTERS ALLOWED (25).
                db  ?         ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER).
                db  26 dup(0) ;CHARACTERS ENTERED BY USER. END WITH CHR(13).

    filename2   db  26        ;MAX NUMBER OF CHARACTERS ALLOWED (25).
                db  ?         ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER).
                db  26 dup(0) ;CHARACTERS ENTERED BY USER. END WITH CHR(13).

    prompt1 db 13,10,"ENTER FILE NAME HERE: $" 
    prompt2 db 13,10,"ENTER A SECOND FILE NAME: $" 

    mess1       db ' I WIN! $'                                               

    buf         db ?

    .code

    main:           
    mov ax, @data       ; set up addressability of data
    mov ds, ax

;DISPLAY MESSAGE.
    lea dx, prompt1            ; load and print the string PROMPT
    mov ah, 9
    int 21h      

;CAPTURE FILENAME FROM KEYBOARD.                                    
    mov ah, 0Ah
    mov dx, offset filename ;THIS VARIABLE REQUIRES THE 3-DB FORMAT.
    int 21h                

;CAPTURED STRING ENDS WITH CHR(13), BUT TO CREATE FILE WE NEED
;THE FILENAME TO END WITH CHR(0), SO LET'S CHANGE IT.
    mov si, offset filename + 1 ;NUMBER OF CHARACTERS ENTERED.
    mov cl, [ si ] ;MOVE LENGTH TO CL.
    mov ch, 0      ;CLEAR CH TO USE CX. 
    inc cx         ;TO REACH CHR(13).
    add si, cx     ;NOW SI POINTS TO CHR(13).
    mov al, 0
    mov [ si ], al ;REPLACE CHR(13) BY 0.            

;CREATE FILE.
    mov ah, 3ch         ; dos service to create file
    mov cx, 0         ;READ/WRITE MODE.
    mov dx, offset filename + 2 ;CHARACTERS START AT BYTE 2.
    int 21h

    jc failed                           ; end program if failed

    mov handle, ax                      ; save file handle

    mov DI, 100 ;CAN'T USE CX BECAUSE WE NEED IT TO WRITE TO FILE.
    PL:
;WRITE STRING ON FILE.
    mov ah, 40h                         ; write to 
    mov bx, handle                      ; file
    mov dx, offset mess1                ; where to find data to write
    mov cx, 7 ;LENGTH OF STRING IN CX.
    int 21h

    DEC DI ;DECREASE COUNTER.
    jnz PL

;CLOSE FILE.           
    mov ah, 3Eh                         ; close file
    mov bx, handle                      ; which file
    int 21h 

;OPEN FILE TO READ FROM IT.
    mov ah, 3DH
    mov al, 0   ;READ MODE.
    mov dx, offset filename + 2
    int 21h
    mov handle, ax                      ; save file handle

;DISPLAY MESSAGE FOR SECOND FILE.
    lea dx, prompt2            ; load and print the string PROMPT
    mov ah, 9
    int 21h      

;CAPTURE FILENAME FROM KEYBOARD.                                    
    mov ah, 0Ah
    mov dx, offset filename2 ;THIS VARIABLE REQUIRES THE 3-DB FORMAT.
    int 21h                

;CAPTURED STRING ENDS WITH CHR(13), BUT TO CREATE FILE WE NEED
;THE FILENAME TO END WITH CHR(0), SO LET'S CHANGE IT.
    mov si, offset filename2 + 1 ;NUMBER OF CHARACTERS ENTERED.
    mov cl, [ si ] ;MOVE LENGTH TO CL.
    mov ch, 0      ;CLEAR CH TO USE CX. 
    inc cx         ;TO REACH CHR(13).
    add si, cx     ;NOW SI POINTS TO CHR(13).
    mov al, 0
    mov [ si ], al ;REPLACE CHR(13) BY 0.            

;CREATE FILE.
    mov ah, 3ch         ; dos service to create file
    mov cx, 0    ;READ/WRITE MODE.
    mov dx, offset filename2 + 2 ;CHARACTERS START AT BYTE 2.
    int 21h

    jc failed                           ; end program if failed

    mov handle2, ax                      ; save file handle

;READ ALL BYTES FROM FIRST FILE AND WRITE THEM TO SECOND FILE.

reading:
;READ ONE BYTE.
    mov ah, 3FH
    mov bx, handle
    mov cx, 1           ;HOW MANY BYTES TO READ.
    mov dx, offset buf  ;THE BYTE WILL BE STORED HERE.
    int 21h             ;NUMBER OF BYTES READ RETURNS IN AX.
;CHECK EOF (END OF FILE).
    cmp ax, 0  ;IF AX == 0 THEN EOF.
    je  eof              
;WRITE BYTE TO THE SECOND FILE.           
    mov ah, 40h                         ; write to 
    mov bx, handle2                     ; file
    mov dx, offset buf                  ; where to find data to write
    mov cx, 1 ;LENGTH OF STRING IN CX.
    int 21h
    jmp reading ;REPEAT PROCESS.
eof:
;CLOSE FILES.           
    mov ah, 3Eh                         ; close file
    mov bx, handle                      ; which file
    int 21h 
    mov ah, 3Eh                         ; close file
    mov bx, handle2                     ; which file
    int 21h 

    failed:

    mov ah, 4ch
    int 21h

    end main

By the way : reading one byte at a time is not efficient, actually, if the file is not too big, it's possible to read it all at once (that's efficient). Another option is to read bytes two by two, or ten by ten, just take care of the last read because maybe will read less than 10 bytes.



来源:https://stackoverflow.com/questions/29571779/how-to-copy-from-one-file-to-another

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!