2014-04-18 3 views
1

MIP 파일에서 (부분적으로) 성공적으로 읽을 수있었습니다. 아래는 현재 코드입니다. QtSpim에서 실행할 때 $ a1에서 파일 포인터를 얻지 만 파일의 마지막 몇 문자는 두 번 반복됩니다. 반복되는 문자 수는 파일에 따라 다릅니다. 필자가 보았던 것에서는 개행 문자가 파일의 맨 끝에 있지 않으면 파일의 개행 문자 수에 연결되어있는 것 같습니다 (즉, 5 개의 개행 문자가있는 경우 파일의 마지막 5 문자는 읽은 파일의 끝에서 복제 된 것처럼 보일 것입니다.) 이것이 사실이어야하는 이유는 없습니다.MIPS에서 파일을 읽을 때 마지막 줄 두 번 읽음

.data 
fin: .asciiz "c:/input.txt" 
fBuffer: .space 1024 
.text 
main: 
    jal openFile 
    jr $ra 

#returns: pointer to file's text in $a1 
openFile: 
    li $v0, 13  # system call for open file 
    la $a0, fin #fin is the file name 
    li $a1, 0 # 0 means 'read' 
    li $a2, 0 
    syscall   # open file 
    move $s6, $v0  # save the file descriptor 

    #read from file 
    li $v0, 14  # system call for read from file 
    move $a0, $s6  # file descriptor 
    la $a1, fBuffer 
    li $a2, 1024  # hardcoded buffer length 
    syscall   # read from file 

    # Close the file 
    li $v0, 16  # system call for close file 
    move $a0, $s6  # file descriptor to close 
    syscall   # close file 
    jr $ra 

답변

1

당신은 마지막 줄을 알 수는이 코드를 반복한다 (대신 쓰기의 읽기를 제외하고 참고로,이 코드는 here에서 거의 그대로 복사됩니다). 네가 준 링크는 파일 읽기 결과 열에 $v0에 읽은 바이트 수가 들어 있음을 분명하게 말합니다. 그러나 코드가 즉시 닫히면 $v0 파일을 닫습니다.

실제로 읽은 문자 만 인쇄하도록 코드를 변경하면 반복되는 정보의 모양이 사라져야합니다.

인쇄 문자열 syscall을 사용하는 경우 오버런 방지를 위해 버퍼에 1 바이트를 추가 한 다음 문자를 읽은 후 널 종결자를 작성하십시오. 다음과 같음 :

syscall   # (your code) read from file 
la $a0, fBuffer # load 32-bit buffer address 
add $a0, $a0, $v0 # calculate address of byte after file data 
sb $zero, 0($a0) # set that byte to zero 
+0

감사합니다. 이것은 그것을했다. 참고로, 코드의 두 번째 줄은 "li $"가 아닌 "la $ a0, fBuffer"가되어야합니다. 그러나 이는 단순한 오타입니다. 내가 파일의 끝 부분에 null char을 수동으로 추가해야하는 잘못된 것을하고 있습니까? 왜 파일의 끝을 복제할까요? –

+0

@Cruzer 파일 읽기는 괜찮습니다 (1024자를 넘지 않는 한). 인쇄 루틴이 예상 한대로 입력을 문자열로 변환하면됩니다. 'fread'를 사용하여 파일을 읽고'puts'를 사용하여 문자열을 인쇄한다면 C에서 똑같은 작업을해야합니다. syscall이 자신의 버퍼링 바로 뒤에 메모리를 사용하여 완료된 후에 데이터를 남겨두기 때문에 중복이 나타나는 것 같습니다. 당신의 print 문은 버퍼의 끝에서 syscall 영역으로 흘러 갔고, 반복 된 정보는 단지 우연이었습니다. 어떤 쓰레기라도 될 수있었습니다. – Gene