2012-06-06 4 views
-1

현재 Java에서 내 Brainfuck 인터프리터를 작성하고 있으며 파일에서 코드를 읽을 수 있기 때문에 불필요한 기호를 필터링하는 BFInputStream을 작성했습니다. 그것은 다음과 같습니다기본 스트림이 0 바이트를 반환했습니다.

import java.io.FilterInputStream; 
import java.io.InputStream; 
import java.io.IOException; 

public class BFInputStream extends FilterInputStream { 
    public BFInputStream(InputStream in) { 
     super(in); 
    } 
    public int read() throws IOException { 
     while(true) { 
      int i = super.read(); 
      // keep LF for line number checking. 
      if(i == -1 || i == 10 ||(i >= 43 && i <= 46) || i == 60 || i == 62 || i == 91 || i == 93) 
       return i; 
     } 
    } 
    public int read(byte[] b, int off, int len) throws IOException { 
     if(off < 0 || len < 0 || len > b.length - off) throw new IndexOutOfBoundsException(); 
     for(int i=0; i<len; i++) { 
      int j = read(); 
      if(j < 1) return i; 
      b[off+i] = (byte)j; 
     } 
     return len; 
    } 
} 

내 통역이 LineNumberReader < 사용 - 파일을 읽을 수 FileInputStream - InputStreamReader <-BFInputStream <합니다.

때 java.io.IOException :하지만 매번 그것이 발생 파일의 끝에 도달 기본이되는 입력 스트림 Interpreter.java:101이 BFInputStream.read()에 대한 호출을 포함

at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:268) 
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306) 
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158) 
    at java.io.InputStreamReader.read(InputStreamReader.java:167) 
    at java.io.BufferedReader.fill(BufferedReader.java:136) 
    at java.io.BufferedReader.read(BufferedReader.java:157) 
    at java.io.LineNumberReader.read(LineNumberReader.java:108) 
    at Interpreter.run(Interpreter.java:101) 
    at Interpreter.main(Interpreter.java:180) 

0 바이트 돌아왔다.

예외를 올바르게 이해하는지 잘 모르겠습니다. 나는 스트림이 전혀 바이트를 반환하지 않았다고 생각한다 (타임 아웃 때문에). BF가 아닌 문자의 거대한 덩어리가 있다면 가능 하겠지만 파일의 끝에 있습니까? FileInputStream이므로 FilterInputStreamBFInputStream은 -1을 반환해야합니다.

내 코드에 어떤 문제가 있습니까?

답변

2

if (j < 1)if (j < 0)이어야합니다. 이는 EOF가 -1으로 표시되기 때문입니다. 또한, 당신의 방법은 결코 EOF에서 -1을 반환하지 않습니다.

올바른 구현과 같을 것이다 :

public int read(byte[] b, int off, int len) throws IOException { 
    if(off < 0 || len <= 0 || len > b.length - off) throw new IndexOutOfBoundsException();   
    int i = 0; 
    while (i < len) { 
     int j = read(); 
     if (j < 0) break; // Stop reading at EOF 
     b[off + i] = (byte) j; 
     i++; 
    } 
    if (i == 0) return -1; // If we get EOF with no data, return it to the caller 
    else return i; 
} 
+0

Exept 당신이 캐스팅 잊었 : 나는 파일에 쓰기 위해 파일

File f = new File("my.txt"); FileReader fr = new FileReader(f); BufferedReader br = new BufferedReader(fr); String s = null; while ((br=readLine())!=null) { // Do whatever u want to do with the content of the file. } br.close(); 

에서 독서를 들어 그것을

시도 ... 당신에게 내가 지침으로 사용하는 코드의 조각을주고있다 'j'는 바이트로 완벽하게 작동합니다. 고마워요. 나는 -1에 대한 수표를 추가하는 것을 잊어 버렸다. 그러나 나는 0 대신에 1이 어떻게 거기에 왔는지 전혀 모른다. – IchBinKeinBaum

+0

@IchBinKeinBaum : 첫 번째 반복에서 EOF를 얻으면 코드에서 0을 생성합니다. – axtavt

+0

예 알아 차렸습니다. 내가 의미하는 바는'if (j <0)'대신'if (j <1)'을 쓰는 이유를 모르겠다. – IchBinKeinBaum

1

음 전에 그러나 파일을 사용하여 같은 좀 일을했다,을 FileReader/라이터와 BufferReader/라이터.

Boolean isDone = true; 
Scanner scan = new Scanner(System.in); 
File f = new File("my.txt"); 
FileWriter fr = new FileWriter(f); 
BufferedWriter br = new BufferedWriter(fr); 

while (b) { 

    if (!b) { 

br.write(new Scanner(System.in).nextLine()); 

} 


} 
관련 문제