чтение входного файла и создание нескольких выходных файлов для хранения данных - PullRequest
0 голосов
/ 26 ноября 2018

Я довольно новичок в ассемблере. Моя задача требует, чтобы я взял имя файла и число в качестве ввода (например, data.txt 100) и разделил этот файл на несколько файлов, каждый из которых содержит 100 символов (так что если мои данные.txt имеет 520 символов, он создаст 6 новых имен файлов data1 data2 ... 6-й файл будет иметь 20 символов.

В настоящее время у меня есть приложение, которое принимает имя входного файла и по мере его создания создает новые файлы (запрашивать имена вторичных файлов до окончания цикла)

проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить файлы автоматически менять имя (data1 data2 data3 ...), также я не могу сделать вторичный вводбыть количеством читаемых символов (поэтому в настоящее время оно установлено на 1)

высоко ценится любая мудрость

мой код:

.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 SECONDARY 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.            

;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
f1:
;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
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 f1 ;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 

mov ah, 4ch
int 21h

end main

1 Ответ

0 голосов
/ 05 декабря 2018
.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 SECONDARY FILE NAME: $" 
prompt3 db 13,10,"ENTER LETTER COUNT: $"

mess1       db ' I WIN! $'                                               

buf         db ?

input  db 30 dup ('$')
n      dw ?
count  dw ?
count2 dw ?
output db 30 dup ('$')
msj    db 13,10,'The number is = $'

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

;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

jmp w1

f1:
;READ ALL BYTES FROM FIRST FILE AND WRITE THEM TO SECOND FILE.
mov count2, 0
reading:


mov ah, 3FH
mov bx, handle

xor dx, dx
mov dx, offset buf

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).
;push cx
cmp ax, 0  ;IF AX == 0 THEN EOF.
je  eof

cmp count2, 0
jne writ
    ;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
mov handle2, ax                      ; save file handle

writ:
inc count2
;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
mov cx, count
cmp cx, count2
je f1
;cmp ax, count
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
mov ah, 4ch
int 21h












;WORK WITH NUMBER
w1:
;DISPLAY MESSAGE.
mov dx , offset prompt3
mov ah, 9
int 21h 
;CAPTURE NUMBER CHAR BY CHAR. NOTICE CHR(13) WILL BE
;STORED IN STRING AND COUNTED.
mov bx , offset input
mov count , 0
l1:
mov ah , 1    
int 21h               ;CAPTURE ONE CHAR FROM KEYBOARD.
mov [bx] , al         ;STORE CHAR IN STRING.
inc bx 
inc count
cmp al , 13
jne l1                ;IF CHAR IS NOT "ENTER", REPEAT.           

dec count             ;NECESSARY BECAUSE CHR(13) WAS COUNTED.


;CONVERT STRING TO NUMBER. 
mov bx , offset input ;BX POINTS TO THE FIRST CHAR.
add bx,  count        ;NOW BX POINTS ONE CHAR AFTER THE LAST ONE.
mov bp, 0             ;BP WILL BE THE NUMBER CONVERTED FROM STRING.
mov cx, 0             ;PROCESS STARTS WITH 10^0.
l2:      
;GET CURRENT POWER OF 10.
cmp cx, 0
je  first_time        ;FIRST TIME IS 1, BECAUSE 10^0 = 1.
mov ax, 10
mul cx                ;CX * 10. NEXT TIME=100, NEXT TIME=1000...
mov cx, ax            ;CX == 10^CX.
jmp l22               ;SKIP THE "FIRST TIME" BLOCK.
first_time:    
mov cx, 1             ;FIRST TIME 10^0 = 1.
l22:    
;CONVERT CURRENT CHAR TO NUMBER.   
dec bx                ;BX POINTS TO CURRENT CHAR.
mov al , [bx]         ;AL = CURRENT CHAR.
sub al , 48           ;CONVERT CHAR TO NUMBER.
;MULTIPLY CURRENT NUMBER BY CURRENT POWER OF 10.
mov ah, 0             ;CLEAR AH TO USE AX.
mul cx                ;AX * CX = DX:AX. LET'S IGNORE DX.
add bp , ax           ;STORE RESULT IN BP.    
;CHECK IF THERE ARE MORE CHARS.    
dec count
cmp count , 0
jne l2
push bp
pop count
jmp f1
end main

Это ответ для людей, имеющих похожую проблему, и это решение, которое я нашел.Приложение будет разбивать файлы на несколько отдельных файлов в зависимости от выбранного размера.Это далеко не самый эффективный способ, поскольку каждая буква читается отдельно, однако она выполняет свою работу, и ей удалось разделить файл изображения и с помощью команд Windows мне удалось восстановить его обратно к исходному изображению.

первый вводтребует имя файла, который вы хотите разделить (например, data.txt или picture.png) секунда - это количество символов, которое вы хотите поместить в один файл (до 35000, будьте осторожны, разбивая файл на 10000 символов)на мелкие кусочки может создать сотни файлов) с третьего по x ввод - это вновь созданные имена файлов (например, data1, data2.txt, data3.png ... и т. д. он будет запрашивать имена файлов, пока первый файл не достигнет конца, поэтомуразделение файла из 100 букв на 1 символ потребует ввода 100 имен).

удачи и удачного программирования:)

...