2015-04-10 4 views
2

J'essaie de copier d'un fichier à un autre. Ainsi, si l'utilisateur est invité à entrer un nom de fichier ... FICHIER1 une chaîne sauvegardée sera copiée dans un fichier puis l'utilisateur est invité à entrer un deuxième nom de fichier ... Fichier2, le contenu du fichier 1 est copié dans le fichier 2 Je peux trouver des informations sur la partie lecture mais je ne sais pas trop comment copier de 1 à l'autre ???Comment copier d'un fichier à un autre?

.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 
+2

Veuillez préciser ce qui vous manque. Tout ce que vous devez faire est de lire le fichier source dans un tampon, puis écrire à partir de ce tampon dans le fichier de destination. Répéter. – Jester

Répondre

2

Ok, Jake, j'ai exécuté votre code et cela fonctionne très bien. Ce dont vous avez besoin est de copier-coller certaines parties déjà présentes, et d'en ajouter trois: ouvrir le premier fichier, en créer un autre et transférer des données. Je modifie votre code pour atteindre l'objectif, ici il est, copier-coller dans votre compilateur et maintenant laissez-moi si cela a fonctionné:

.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 

Soit dit en passant: la lecture d'un octet à la fois est pas efficace, en fait , si le fichier n'est pas trop gros, il est possible de tout lire en une fois (c'est efficace). Une autre option consiste à lire les octets deux par deux, ou dix par dix, juste prendre soin de la dernière lecture, car peut-être lira moins de 10 octets.

+1

Cela fonctionne parfaitement !! Je vous remercie!! – jake

+1

Existe-t-il un moyen d'avoir un fichier automatiquement appelé fichier .txt sans le spécifier lorsqu'il est demandé un nom de fichier? – jake

+1

Content de t'avoir aidé. Et oui, il est possible d'ajouter l'extension ".txt" automatiquement, mais il faudrait d'abord vérifier si le nom de fichier entré a déjà une extension, dans ce cas, il ne faut pas ajouter l'extension, mais, si elle n'a pas il faut l'ajouter. Ce que vous avez à faire est de vérifier si les 4 derniers caractères du nom de fichier sont ".txt" (nous changeons déjà le dernier char 13 par 0). Pour ajouter l'extension, prenez soin d'ajouter 4 octets de plus à la longueur de la variable qui contient le nom de fichier. –